Skip to content

Commit 2636bd4

Browse files
💥 refactor!: Split isPartitioned and firstInversion.
BREAKING CHANGE: The API has changed.
1 parent d3fa3e9 commit 2636bd4

File tree

15 files changed

+112
-69
lines changed

15 files changed

+112
-69
lines changed

src/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
1-
export * from './partition/index.js';
2-
export * from './utils/index.js';
1+
export {default as hoare} from './partition/hoare.js';
2+
export {default as lomuto} from './partition/lomuto.js';
3+
export {default as yaroslavskiy} from './partition/yaroslavskiy.js';
4+
export {default as firstInversion} from './utils/firstInversion.js';
5+
export {default as isPartitioned} from './utils/isPartitioned.js';
6+
export {default as whole} from './utils/whole.js';

src/partition/hoare.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
import assert from 'assert';
2+
13
/**
2-
* HYP : i < j
4+
* @param {Function} compare
5+
* @param {Array} a
6+
* @param {number} i
7+
* @param {number} j
8+
* @return {number}
39
*/
10+
const hoare = (compare, a, i, j) => {
11+
assert(i < j);
412

5-
export function hoare(compare, a, i, j) {
613
const o = i;
714
const x = a[o];
815

@@ -41,4 +48,6 @@ export function hoare(compare, a, i, j) {
4148
a[i] = a[j];
4249
a[j] = t;
4350
}
44-
}
51+
};
52+
53+
export default hoare;

src/partition/index.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/partition/lomuto.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
import assert from 'assert';
2+
13
/**
2-
* HYP : i < j
4+
* @param {Function} compare
5+
* @param {Array} a
6+
* @param {number} i
7+
* @param {number} j
8+
* @return {number}
39
*/
10+
const lomuto = (compare, a, i, j) => {
11+
assert(i < j);
412

5-
export function lomuto(compare, a, i, j) {
613
const p = a[i];
714
let k = i + 1;
815

@@ -24,4 +31,6 @@ export function lomuto(compare, a, i, j) {
2431
a[k - 1] = p;
2532

2633
return k - 1;
27-
}
34+
};
35+
36+
export default lomuto;

src/partition/yaroslavskiy.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1+
import assert from 'assert';
2+
13
/**
2-
* HYP : i < j
4+
* See http://cs.stackexchange.com/a/24099/20711
35
*
4-
* http://cs.stackexchange.com/a/24099/20711
6+
* @param {Function} compare
7+
* @param {Array} a
8+
* @param {number} i
9+
* @param {number} j
10+
* @return {[number, number]}
511
*/
6-
7-
export function yaroslavskiy(compare, a, i, j) {
12+
const yaroslavskiy = (compare, a, i, j) => {
13+
assert(i < j);
814
--j;
915

1016
// Choose outermost elements as pivots
@@ -64,4 +70,6 @@ export function yaroslavskiy(compare, a, i, j) {
6470
a[g] = t2;
6571

6672
return [l, g];
67-
}
73+
};
74+
75+
export default yaroslavskiy;

src/utils/firstInversion.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Checks whether range [left,right[ of array is partitioned according to pivot
3+
* p. Returns the index of the first inversion.
4+
*
5+
* @param {Function} compare
6+
* @param {ArrayLike} array
7+
* @param {number} left
8+
* @param {number} right
9+
* @param {number} p
10+
* @return {number}
11+
*/
12+
const firstInversion = (compare, array, left, right, p) => {
13+
for (let k = left; k < p; ++k) {
14+
if (compare(array[k], array[p]) > 0) return k;
15+
}
16+
17+
for (let k = p + 1; k < right; ++k) {
18+
if (compare(array[k], array[p]) < 0) return k;
19+
}
20+
21+
return right;
22+
};
23+
24+
export default firstInversion;

src/utils/index.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/utils/isPartitioned.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import firstInversion from './firstInversion.js';
2+
3+
/**
4+
* Checks whether range [left,right[ of array is partitioned according to pivot
5+
* p.
6+
*
7+
* @param {Function} compare
8+
* @param {ArrayLike} array
9+
* @param {number} left
10+
* @param {number} right
11+
* @param {number} p
12+
* @return {boolean}
13+
*/
14+
const isPartitioned = (compare, array, left, right, p) =>
15+
firstInversion(compare, array, left, right, p) === right;
16+
17+
export default isPartitioned;

src/utils/ispartitioned.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/utils/whole.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
export function whole(partition) {
2-
return function (compare, array) {
3-
return partition(compare, array, 0, array.length);
4-
};
5-
}
1+
const whole = (partition) => (compare, array) =>
2+
partition(compare, array, 0, array.length);
3+
4+
export default whole;

0 commit comments

Comments
 (0)