Skip to content

Commit 7bd9840

Browse files
committed
feat: add flashsort
Related: #14
1 parent 81bd46c commit 7bd9840

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

Sorts/flashSort.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Flashsort is a distribution sorting algorithm showing linear computational complexity O(n) for uniformly distributed
3+
* data sets and relatively little additional memory requirement.
4+
* more information: https://en.wikipedia.org/wiki/Flashsort
5+
*/
6+
7+
function flashSort(arr) {
8+
let max = 0, min = arr[0];
9+
let n = arr.length;
10+
let m = ~~(0.45 * n);
11+
let l = new Array(m);
12+
13+
for (let i = 1; i < n; ++i) {
14+
if (arr[i] < min) {
15+
min = arr[i];
16+
}
17+
if (arr[i] > arr[max]) {
18+
max = i;
19+
}
20+
}
21+
22+
if (min === arr[max]) {
23+
return arr;
24+
}
25+
26+
let c1 = (m - 1) / (arr[max] - min);
27+
28+
for (let k = 0; k < m; k++) {
29+
l[k] = 0;
30+
}
31+
32+
for (let j = 0; j < n; ++j) {
33+
k = ~~(c1 * (arr[j] - min));
34+
++l[k];
35+
}
36+
37+
for (let p = 1; p < m; ++p) {
38+
l[p] = l[p] + l[p - 1];
39+
}
40+
41+
let hold = arr[max];
42+
arr[max] = arr[0];
43+
arr[0] = hold;
44+
45+
// permutation
46+
let move = 0, t, flash;
47+
j = 0;
48+
k = m - 1;
49+
50+
while (move < (n - 1)) {
51+
while (j > (l[k] - 1)) {
52+
++j;
53+
k = ~~(c1 * (arr[j] - min));
54+
}
55+
if (k < 0) break;
56+
flash = arr[j];
57+
while (j !== l[k]) {
58+
k = ~~(c1 * (flash - min));
59+
hold = arr[t = --l[k]];
60+
arr[t] = flash;
61+
flash = hold;
62+
++move;
63+
}
64+
}
65+
66+
// insertion
67+
for (j = 1; j < n; j++) {
68+
hold = arr[j];
69+
i = j - 1;
70+
while (i >= 0 && arr[i] > hold) {
71+
arr[i + 1] = arr[i--];
72+
}
73+
arr[i + 1] = hold;
74+
}
75+
return arr;
76+
}
77+
78+
const array = [3, 0, 2, 5, -1, 4, 1, -2];
79+
80+
// Array before Sort
81+
console.log("-----before sorting-----");
82+
console.log(array);
83+
// Array after sort
84+
console.log("-----after sorting-----");
85+
console.log(flashSort(array));

0 commit comments

Comments
 (0)