快速排序
套路
选定中心轴 pivot
将大于中心轴的数字放在 pivot 的右边
将小于中心轴的数字放在 pivot 的左边
分别对左右子序列重复前三步操作
js
function arraySort(target) {
let result = [...target]
/**
* 单边排序任务
*/
function sort(arr, start, end) {
// 记录中心轴的数字
const base = arr[start]
let left = start
let right = end
while (left < right) {
// 先移动右指针
while (arr[right] >= base && left < right) {
right--
}
// 到这一步说明右指针数字小于中心轴,此时右指针空置
arr[left] = arr[right]
// 开始移动左指针
while (arr[left] < base && left < right) {
left++
}
// 到这一步说明左指针数字大于中心轴,此时左指针空置
arr[right] = arr[left]
// continue // 进入下一轮循环
}
// 循环结束是left===right
arr[left] = base
return left // 返回此时的指针位置
}
/**
* 主流程
*/
function quickSort(arr, start, end) {
if (start < end) {
const mid = sort(arr, start, end)
// 对左边排一次
quickSort(arr, 0, mid)
// 对右边排一次
quickSort(arr, mid + 1, end)
}
}
// 传入初始条件
quickSort(result, 0, result.length - 1)
return result
}
function arraySort(target) {
let result = [...target]
/**
* 单边排序任务
*/
function sort(arr, start, end) {
// 记录中心轴的数字
const base = arr[start]
let left = start
let right = end
while (left < right) {
// 先移动右指针
while (arr[right] >= base && left < right) {
right--
}
// 到这一步说明右指针数字小于中心轴,此时右指针空置
arr[left] = arr[right]
// 开始移动左指针
while (arr[left] < base && left < right) {
left++
}
// 到这一步说明左指针数字大于中心轴,此时左指针空置
arr[right] = arr[left]
// continue // 进入下一轮循环
}
// 循环结束是left===right
arr[left] = base
return left // 返回此时的指针位置
}
/**
* 主流程
*/
function quickSort(arr, start, end) {
if (start < end) {
const mid = sort(arr, start, end)
// 对左边排一次
quickSort(arr, 0, mid)
// 对右边排一次
quickSort(arr, mid + 1, end)
}
}
// 传入初始条件
quickSort(result, 0, result.length - 1)
return result
}