为什么QuickSort的这个功能版本会破坏?我该如何解决?

时间:2016-11-05 04:34:46

标签: javascript sorting functional-programming stack-overflow quicksort

此实现将堆栈放在任何大小的数组上:

function quickSort(arr){

  let pivot = arr[arr.length-1]

  return quickSort(arr.filter((num) => (num < pivot)))
    .concat(quickSort(arr.filter((num) => (num >= pivot))))
}

为什么这不起作用?如果可以修复,我该怎么做?

1 个答案:

答案 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的典型部分。