快排的基本逻辑
- 从数组中选择一个基准点
- 所有比基准值小的元素摆放在基准值左边,而大于基准值的摆放在右边
- 重复上述操作直到排序完成
快排低配版
function quickSort(arr: number[]): number[] {
if (arr && arr.length <= 1) return arr;
let left = [],
right = [],
basePoint = arr[0];
for (const item of arr.slice(1)) {
if (item < basePoint) {
left.push(item);
} else {
right.push(item);
}
}
return [...quickSort(left), basePoint, ...quickSort(right)];
}
这一串代码很容易理解,缺点是每次递归都创建了左右两个数组,有额外的内存消耗
快排高配版
function quickSort(arr: number[], start: number = 0, end: number = arr.length - 1): number[] {
if (start < end) {
const divideIndex = divide(arr, start, end);
quickSort(arr, start, divideIndex - 1);
quickSort(arr, divideIndex, end);
}
return arr;
}
function divide(arr: number[], startIndex: number, endIndex: number): number {
const basePoint = arr[endIndex];
let divideIndex = startIndex - 1;
for (let i = startIndex; i < endIndex; i++) {
if (arr[i] < basePoint) {
divideIndex++;
[arr[divideIndex], arr[i]] = [arr[i], arr[divideIndex]];
}
}
divideIndex++;
[arr[divideIndex], arr[endIndex]] = [arr[endIndex], arr[divideIndex]];
return divideIndex;
}
- divide函数负责将比基准值小的依次交换到数组左边,并将自己与比起小的基准值最后一个的下一个交换,达到以基准值分割左右的目的;返回基准值的位置
- 此种方式在原数组上操作,未创建新的数组