JS实现常见排序算法(快排/归并/堆排序)
请用JavaScript实现快速排序、归并排序和堆排序,并分析时间复杂度与空间复杂度。
回答
专业代码师
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(arr.length / 2)];
const left = arr.filter(x => x < pivot);
const mid = arr.filter(x => x === pivot);
const right = arr.filter(x => x > pivot);
return [...quickSort(left), ...mid, ...quickSort(right)];
}
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
const res = [];
while (left.length && right.length)
res.push(left[0] < right[0] ? left.shift() : right.shift());
return [...res, ...left, ...right];
}
function heapSort(arr) {
function heapify(arr, n, i) {
let largest = i, l = 2*i+1, r = 2*i+2;
if (l < n && arr[l] > arr[largest]) largest = l;
if (r < n && arr[r] > arr[largest]) largest = r;
if (largest !== i) { [arr[i], arr[largest]] = [arr[largest], arr[i]]; heapify(arr, n, largest); }
}
for (let i = Math.floor(arr.length/2)-1; i >= 0; i--) heapify(arr, arr.length, i);
for (let i = arr.length-1; i > 0; i--) { [arr[0], arr[i]] = [arr[i], arr[0]]; heapify(arr, i, 0); }
return arr;
}
选型:快排平均最快(工程常用)、归并稳定(外排序)、堆排序最坏情况保证(优先级队列)。