JavaScript排序算法
class Sort {
static doInsertSort(list = []) {
let cnt=0;
let arr = [...list];
for (let i = 1; i < arr.length; i++) {
let temp = arr[i];
let j = i;
while (j > 0 && arr[j - 1] >= temp) {
arr[j] = arr[j - 1];
j--;
cnt++
}
arr[j] = temp;
}
return [arr,cnt];
}
static doShellSort(list = []) {
let cnt=0;
let arr = [...list];
let len = arr.length;
for (let gap = Math.floor(len / 2); gap >= 1; gap = Math.floor(gap / 2)) {
for (let i = gap; i < len; i++) {
let temp = arr[i];
let j = i;
while (j >= gap && arr[j - gap] >= temp) {
arr[j] = arr[j - gap];
j -= gap;
cnt++;
}
arr[j] = temp;
}
}
return [arr,cnt];
}
static doQuickSort(arr = []) {
if (arr.length <= 0) {
return [];
}
let leftArr = [];
let rightArr = [];
let middleArr = [];
let pivot = arr[0];
arr.forEach(item => {
if (item < pivot) {
leftArr.push(item);
} else if (item > pivot) {
rightArr.push(item);
} else {
middleArr.push(item);
}
});
return Sort.doQuickSort(leftArr).concat(middleArr, Sort.doQuickSort(rightArr));
}
static doMergeSort(list = []) {
let cnt=0;
let result = [];
let temp = [];
for (let step = 1; step < list.length; step *= 2) {
for (let i = 0; i <= list.length; i += step * 2) {
temp = Sort.mergeSortedArr(list.slice(i, i + step), list.slice(i + step, i + step * 2))
result.push(...temp);
cnt++
}
list = result;
result = [];
}
return [list,cnt];
}
static mergeSortedArr(leftArr = [], rightArr = []) {
let result = [];
while (leftArr.length > 0 && rightArr.length > 0) {
if (leftArr[0] <= rightArr[0]) {
result.push(leftArr.shift());
} else {
result.push(rightArr.shift());
}
}
if (leftArr.length > 0) {
result = result.concat(leftArr);
} else {
result = result.concat(rightArr);
}
return result;
}
static doBubbleSort(list = []) {
let cnt=0;
let arr = [...list];
for (let i = arr.length; i >= 2; i--) {
for (let j = 0; j <= i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
cnt++
}
}
return [arr,cnt];
}
static doChooseSort(list = []) {
let cnt=0;
let arr = [...list]
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
cnt++
}
}
return [arr,cnt];
}
}
let a = [72, 54, 59, 30, 31, 78, 2, 77, 82, 72]
console.log(Sort.doInsertSort(a));
console.log(Sort.doShellSort(a));
console.log(Sort.doQuickSort(a));
console.log(Sort.doMergeSort(a));
console.log(Sort.doChooseSort(a));
console.log(Sort.doBubbleSort(a));