在大多数情况下,Quicksort是一种比选择排序更有效的搜索算法,它利用了递归的方法。
递归意味着我们从同一个函数中调用一个函数。这是一种非常有用的做法,有时,这就是其中的一种情况。
我说 "在大多数情况下",因为正如我们将看到的,在最坏的情况下,泡沫排序可能需要与选择排序相同的时间:O(n^2) 。但是在最好的情况下,它将在O(n log n) ,也就是在O(n) 和O(n^2) 的中间位置运行。
它是如何工作的?给定一个数组,我们挑选一个项目,称为pivot。然后我们得到所有比枢轴小的项,以及比枢轴大的项。
然后,我们对组成小项和大项的两个数组进行同样的操作。
看到代码比描述它更容易。
const quickSort = (originalList) => {
const list = [...originalList]
if (list.length < 2) {
return list
}
const pivot = list[0]
const smaller = list.filter((item) => item < pivot)
const bigger = list.filter((item) => item > pivot)
return [...quickSort(smaller), pivot, ...quickSort(bigger)]
}
在这种情况下,我选择了枢轴作为数组中的第一个项目,但它也可以是中间的项目,例如。
const pivot = list[Math(floor(list.length / 2)]
注意我们是如何首先复制数组的,所以调用quickSort() ,并没有修改原来的数组,只是返回一个新的排序数组。
const a = [1, 6, 3, 4, 5, 1, 0, 4, 8]
console.log(quickSort(a))
//[0, 1, 1, 3, 4, 4, 5, 6, 8
console.log(a)
//[1, 6, 3, 4, 5, 1, 0, 4, 8]