Home Manual Reference Source

src/partition/hoare.js

import assert from 'assert';

/**
 * @param {Function} compare
 * @param {Array} a
 * @param {number} i
 * @param {number} j
 * @return {number}
 */
const hoare = (compare, a, i, j) => {
	assert(i < j);

	const o = i;
	const x = a[o];

	while (true) {
		while (true) {
			--j;

			if (i >= j) {
				a[o] = a[j];
				a[j] = x;
				return j;
			}

			if (compare(x, a[j]) > 0) {
				break;
			}
		}

		while (true) {
			++i;

			if (i >= j) {
				a[o] = a[j];
				a[j] = x;
				return j;
			}

			if (compare(x, a[i]) < 0) {
				break;
			}
		}

		// Invariant i < j

		const t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
};

export default hoare;