1 ) 简单版本,消耗内存
function quickSort(arr: number[]) {
// 1.核心函数
const qsFn = (arr: number[]) => {
if (arr.length <= 1) return arr;
const pivotIndex: number = Math.floor(arr.length / 2);
const pivot: number = arr.splice(pivotIndex, 1)[0];
const left: number[] = [];
const right: number[] = [];
arr.forEach(item => {
if (item < pivot) left.push(item);
if (item > pivot) right.push(item);
});
return qsFn(left).concat([pivot], qsFn(right));
}
// 2.执行核心函数
const res: number[] = qsFn(arr); // res 用于返回最终结果
arr.splice(0, arr.length, ...res); // 将最终排好序的结果赋值给原数组arr
// 3. 可以有返回值
return arr; // 可以用于返回值
};
const arr = [15, 4, 23, 52, 1];
quickSort(arr);
console.log(arr); // [1, 4, 15, 23, 52]
2 )基于指针版本, 优化内存
const quickSort = (array: number[], replace: boolean) => {
// 1. 核心函数
const qsFn = (arr: number[], left: number = 0, right: number = arr.length - 1) => {
//如果左边的索引大于等于右边的索引说明整理完毕
if (left >= right) return;
let low: number = left; // 低指针
let high: number = right; // 高指针
const pivot: number = arr[high]; // 取无序数组最后一个数为基准值
// 把所有比基准值小的数放在左边, 大的数放在右边
while (low < high) {
// 找到一个比基准值大的数交换
while (low < high && arr[low] <= pivot) low ++;
arr[high] = arr[low]; // 将较大的值放在右边,如果没有比基准值大的数就是将自己赋值给自己
// 找到一个比基准值小的数交换
while (high > low && arr[high] >= pivot) high --;
arr[low] = arr[high]; // 将较小的值放在左边,如果没有找到比基准值小的数就是将自己赋值给自己
}
arr[high] = pivot; // 将基准值放至中央位置完成一次循环
qsFn(arr, low, high - 1) // 将左边的无序数组重复上面的操作
qsFn(arr, high + 1, right) // 将右边的无序数组重复上面的操作
}
// 2. 准备执行核心函数, 多加一项配置 (是否影响原数组)
const result = replace ? array : array.concat(); // 基于配置,为了保证这个函数是纯函数拷贝一次数组, 这样不影响原array数组
qsFn(result);
return result; // 配置replace为true则可以不用返回值
}
const arr = [15,4,23,52,1];
quickSort(arr, true); // 不加第二个参数, 不会影响原 arr
console.log(arr); // [1, 4, 15, 23, 52]