快速排序是一种更有效的搜索算法比选择排序,在大多数情况下,这让使用递归的。
递归意味着我们从同一函数内调用一个函数。有时,这是一种非常有用的做法,这是其中一种情况。
我“在大多数情况下”说,因为我们将看到,在最坏情况下,冒泡排序可以采取相同的选择时间排序:O(n^2)
。但在最佳情况下,它将O(n log n)
在O(n)
和之间的中间运行O(n^2)
。
它是如何工作的?给定一个数组,我们选择一个称为数据透视表的项目。然后,我们得到所有小于枢轴的项目,以及大于枢轴的项目。
然后,我们在组成越来越小的项目的2数组上运行相同的操作。
看代码比描述代码容易:
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]```