mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-09-20 07:43:04 +08:00
Merge eb8ca90bb0
into ca3d16dcce
This commit is contained in:
commit
441e96ff1c
@ -1,41 +1,39 @@
|
||||
import Sort from '../Sort';
|
||||
|
||||
export default class ShellSort extends Sort {
|
||||
sort(originalArray) {
|
||||
// Prevent original array from mutations.
|
||||
const array = [...originalArray];
|
||||
sort(originalArray) {
|
||||
// Prevent original array from mutations.
|
||||
const array = [...originalArray];
|
||||
|
||||
// Define a gap distance.
|
||||
let gap = Math.floor(array.length / 2);
|
||||
// Define a gap distance.
|
||||
let gap = Math.floor(array.length / 2);
|
||||
|
||||
// Until gap is bigger then zero do elements comparisons and swaps.
|
||||
while (gap > 0) {
|
||||
// Go and compare all distant element pairs.
|
||||
for (let i = 0; i < (array.length - gap); i += 1) {
|
||||
let currentIndex = i;
|
||||
let gapShiftedIndex = i + gap;
|
||||
// Until gap is bigger then zero do elements comparisons and swaps.
|
||||
while (gap > 0) {
|
||||
// Go and compare all distant element pairs.
|
||||
for (let i = 0; i < (array.length - gap); i += 1) {
|
||||
let currentIndex = i;
|
||||
let gapShiftedIndex = i + gap;
|
||||
|
||||
while (currentIndex >= 0) {
|
||||
// Call visiting callback.
|
||||
this.callbacks.visitingCallback(array[currentIndex]);
|
||||
while (currentIndex >= 0) {
|
||||
// Call visiting callback.
|
||||
this.callbacks.visitingCallback(array[currentIndex]);
|
||||
|
||||
// Compare and swap array elements if needed.
|
||||
if (this.comparator.lessThan(array[gapShiftedIndex], array[currentIndex])) {
|
||||
const tmp = array[currentIndex];
|
||||
array[currentIndex] = array[gapShiftedIndex];
|
||||
array[gapShiftedIndex] = tmp;
|
||||
}
|
||||
// Compare and swap array elements if needed.
|
||||
if (this.comparator.lessThan(array[gapShiftedIndex], array[currentIndex])) {
|
||||
[array[currentIndex], array[gapShiftedIndex]] = [array[gapShiftedIndex], array[currentIndex]];
|
||||
}
|
||||
|
||||
gapShiftedIndex = currentIndex;
|
||||
currentIndex -= gap;
|
||||
gapShiftedIndex = currentIndex;
|
||||
currentIndex -= gap;
|
||||
}
|
||||
}
|
||||
|
||||
// Shrink the gap.
|
||||
gap = Math.floor(gap / 2);
|
||||
}
|
||||
}
|
||||
|
||||
// Shrink the gap.
|
||||
gap = Math.floor(gap / 2);
|
||||
// Return sorted copy of an original array.
|
||||
return array;
|
||||
}
|
||||
|
||||
// Return sorted copy of an original array.
|
||||
return array;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user