Skip to content

Commit 61eb8f7

Browse files
committed
Use Tokuda's gap sequence in shell sort
1 parent c57acae commit 61eb8f7

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

src/lib/sort-algorithms/shell-sort.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,17 @@ import type { SortingGenerator } from './types';
33
export const shellSort = function* (arr: number[]): SortingGenerator {
44
const n = arr.length;
55

6-
for (let gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap / 2)) {
6+
// Tokuda's gap sequence: 1, 4, 9, 20, 46, 103, 233, 525, ...
7+
// Much better worst case than Shell's original n/2, n/4, ... split.
8+
const gaps: number[] = [];
9+
for (let k = 0; ; k++) {
10+
const gap = Math.ceil((9 * Math.pow(9 / 4, k) - 4) / 5);
11+
if (gap >= n) break;
12+
gaps.push(gap);
13+
}
14+
15+
for (let g = gaps.length - 1; g >= 0; g--) {
16+
const gap = gaps[g];
717
for (let i = gap; i < n; i++) {
818
const temp = arr[i]; // 1 read
919
let j = i;

0 commit comments

Comments
 (0)