function createArray(num) { let res = []; for (let i = 0; i < num; i++) { res.push(Math.floor(Math.random() * num)); } return res;}function checkArraySorted(arr) { let res = true; for (let i = 0, length = arr.length - 1; i < length; i++) { if (arr[i] > arr[i + 1]) { res = false; break; } } return res;}let arr = createArray(10000);/** * 冒泡排序 * 复杂度: O(n2) * 327.085ms */function bubbleSort(arr) { let length = arr.length; for (let i = 0; i < length; i++) { for (let j = 0; j < length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } }}/** * 抉择排序 * 复杂度: O(n2) * 94.6 ms */function selectSort() { let length = arr.length; for (let i = 0; i < length; i++) { let minIndex = i; for (let j = i + 1; j < length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } if (minIndex > i) { [arr[minIndex], arr[i]] = [arr[i], arr[minIndex]]; } }}/** * 插入排序 * 工夫复杂度: 最差为O(n2), 空间复杂度: O(1) * 5.284ms * 思维: 假如前 i - 1 个元素曾经排序好了, 为第 i 个元素在前 i 个元素中找到正确的地位 * 适宜: nearly sorted数组 * 个性: 稳固; 对于 nearly sorted 数组, 工夫复杂度降为 O(1) */function insertSort(arr) { let length = arr.length; for (let outer = 1; outer < length; outer++) { let inner = outer; while (inner > 0 && arr[outer] < arr[inner - 1]) { arr[inner] = arr[inner - 1]; inner--; } arr[inner] = arr[outer]; }}/** * 归并排序 * 工夫复杂度: O(nlogn) 空间复杂度: O(nlogn) * 27.349ms */function mergeSort(arr) { if (arr.length > 1) { let mid = arr.length >> 1; let left = mergeSort(arr.slice(0, mid)); let right = mergeSort(arr.slice(mid)); arr = merge(left, right); } return arr; function merge(left, right) { let i = j = 0; let res = []; while (left[i] && right[j]) { if (left[i] < right[j]) { res.push(left[i]); i++; } else { res.push(right[j]); j++; } } return res.concat(left[i] ? left.slice(i) : right.slice(j)); }}/** * 疾速排序 * 工夫复杂度: O(nlogn) * 22.066ms * */function quickSort(arr) { if (arr.length < 2) { return arr; } let base = arr[0]; let less = []; let greater = []; for (let i = 1, length = arr.length; i < length; i++) { if (arr[i] > base) { greater.push(arr[i]); } else { less.push(arr[i]); } } return quickSort(less).concat(base).concat(quickSort(greater));}function quickSort2(arr) { return quick(arr, 0, arr.length - 1); function quick(arr, left, right) { if (right > left) { let index = partition(arr, left, right); if (left < index - 1) { quick(arr, left, index - 1); } quick(arr, index, right); } return arr; } function partition(arr, left, right) { let pivot = arr[(left + right) >> 1]; while (left <= right) { while (arr[left] < pivot) { left++; } while (arr[right] > pivot) { right--; } if (left <= right) { [arr[left], arr[right]] = [arr[right], arr[left]]; left++; right--; } } return left; }}console.time();arr = quickSort2(arr);console.timeEnd();console.log(checkArraySorted(arr));