快排思想
- 原地排序
- 第一次取首部 start = 0 end = nums.length
- 当 start < end 时进行 partition
- partition 即 取数组的第一个值 作为 pivot,循环遍历数组 start -> start
- 设置两个指针 slow, fast, slow = start,fast = slow + 1 如果遍历过程中发现小于 pivot的值,则进行 i++操作后,调换位置 swap(arr, i, j)
- 最后 slow 指针即指定了 pivot所在位置所以再次交换位置,swap(arr, pivot, slow),最后将slow返回
- 对已经划分好的两部分内容 small部分 quickSort(arr, start, p),和bigger部分 quickSort(arr, p + 1, end)进行递归操作即可
const swap = (arr, i, j) => {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
const partition = (arr, start, end) => {
const pivot = arr[start]
let i = start
for (let j = i + 1; j < end; j++) {
if (arr[j] < pivot) {
i++
swap(arr, i, j)
}
}
swap(arr, start, i)
return i
}
function quickSort(arr, start, end) {
if (start < end) {
const p = partition(arr, start, end)
quickSort(arr, start, p)
quickSort(arr, p + 1, end)
}
}
function sortArray(nums) {
quickSort(nums, 0, nums.length)
return nums
}
简易写法
function quickSort (items) {
const length = items.length
if (length <= 1) {
return items
}
const PIVOT = items[0]
const GREATER = []
const LESSER = []
for (let i = 1; i < length; i++) {
if (items[i] > PIVOT) {
GREATER.push(items[i])
} else {
LESSER.push(items[i])
}
}
const sorted = [...quickSort(LESSER), PIVOT, ...quickSort(GREATER)]
return sorted
}