此实现将堆栈放在任何大小的数组上:
function quickSort(arr){
let pivot = arr[arr.length-1]
return quickSort(arr.filter((num) => (num < pivot)))
.concat(quickSort(arr.filter((num) => (num >= pivot))))
}
为什么这不起作用?如果可以修复,我该怎么做?
答案 0 :(得分:0)
想象一下,数组已经排序,例如。 [3]
。数据透视图为3
,两次递归为[]
和[3]
。 []
的支点为undefined
,但这并不能使其在大于或小于undefined
的情况下进行过滤,这完全可以,因为谓词永远不会被测试为零元素数组。这两个过滤器都变为[]
,您可以从一个过滤器中获得[]
两次递归。
quickSort([]) // ==>
quickSort([])
.concat(quickSort([])) // ==>
quickSort([])
.concat(quickSort([]))
.concat(quickSort([])) // ==>
quickSort([])
.concat(quickSort([]))
.concat(quickSort([]))
.concat(quickSort([])) // ==>
... (expands forever on an infinite space machine)
请注意,我只是扩展到第一个左手,因为右手你永远不会到达。
因此,quicksort不会对具有一个或多个元素的数组进行排序。在这种情况下,您有一个基本情况,只是按原样返回数组。
您的实施仍然存在问题。想象一下,每次最后[3 3 3]
和[]
排序[3 3 3]
。传统上,枢轴在两个排序的阵列之间放置,而不包括在最后一个阵列中。这样你有最快的情况,但工作解决方案。
关于Quicksort is required to be in-place
Quareort,正如Hoare在他的开创性论文中所定义的那样,是一个原位的 算法。 Hoare的就地分区是他论文的主要贡献 并且是quicksort的典型部分。