每日一算法:快速排序
2021-05-06 本文已影响0人
lio_zero
快速排序是一种最流行的排序算法之一,它的关键在于,快速排序是一种分而治之的算法。如果你不了解,可以查看我之前写的一篇:每日一算法:分治法。
工作原理
-
从数列中挑出一个元素,称为 "基准"(pivot);
-
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
JavaScript 实现
使用 quicksort 算法对数字数组进行排序。
- 使用递归。
- 使用展开运算符(
...
)克隆原始数组arr
。 - 如果数组的
length
小于2
,则返回克隆的数组。 - 使用
Math.floor()
计算轴心元素的索引。 - 使用
Array.prototype.reduce()
和Array.prototype.push()
将数组拆分为两个子数组(元素小于或等于pivot
和大于元素,并将其分解为两个数组)。 - 递归调用
quickSort()
创建的子数组。
const quickSort = arr => {
const a = [...arr]
if (a.length < 2) return a
const pivotIndex = Math.floor(arr.length / 2)
const pivot = a[pivotIndex]
const [lo, hi] = a.reduce(
(acc, val, i) => {
if (val < pivot || (val === pivot && i != pivotIndex)) {
acc[0].push(val)
} else if (val > pivot) {
acc[1].push(val)
}
return acc
},
[[], []]
)
return [...quickSort(lo), pivot, ...quickSort(hi)]
}
quickSort([1, 6, 1, 5, 3, 2, 1, 4]) // [1, 1, 1, 2, 3, 4, 5, 6]
此示例来自 30 seconds of code 的 quickSort
更多资料
QuickSort Tail Call Optimization (Reducing worst case space to Log n )
Python 的实现方法:Quicksort tutorial: Python implementation with line by line explanation