快速排序
实现方法
- 从数列中挑出一个元素, 称为 "基准" (pivot);
- 重新排序数列, 所有元素比基准值小的摆放在基准前面, 所有元素比基准值大的摆在基准的后面(相同的数可以到任一边). 在这个分区退出之后, 该基准就处于数列的中间位置. 这个称为分区(partition)操作;
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序.
实现
export function quickSort(arr: number[]) {
if (arr.length <= 1) {
return arr
}
const pivotIndex = Math.floor(arr.length / 2)
const pivot = arr.splice(pivotIndex, 1)[0]
const low: number[] = []
const high: number[] = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
low.push(arr[i])
} else {
high.push(arr[i])
}
}
return quickSort(low).concat([pivot], quickSort(high))
}
另一种更加细化的实现
function swap(items: number[], lowIndex: number, highIndex: number) {
const temp = items[lowIndex]
items[lowIndex] = items[highIndex]
items[highIndex] = temp
}
// 快速选择算法
function partition(items: number[], low: number, high: number) {
let i = low
const pivot = items[high]
for (let j = low; j < high; j++) {
if (items[j] < pivot) {
swap(items, i, j)
i++
}
}
swap(items, i, high)
return i
}
function quickSort1(items: number[], low: number, high: number): number[] {
if (low >= high) return []
const i = partition(items, low, high)
quickSort1(items, low, i - 1)
quickSort1(items, i + 1, high)
return items
}