快速排序算法:我不断得到一个不同的答案

时间:2012-08-11 20:14:17

标签: algorithm sorting quicksort

我正在尝试为本周二即将进行的测试研究各种排序和搜索算法。一切顺利,直到我进入快速排序算法。我没有书或任何其他资源,所以我上网并开始阅读SparkNote。我以为我理解了文本,甚至还读到了我在网上发现的PowerPoint的快速排序算法部分。

但是,SparkNote在算法的逐步过程的页面上提供了一个示例,但它没有显示最初排列列表的步骤。给出的列表是[5 9 3 8 6 4 2 1 7 0]。根据SparkNotes,排列列表的值小于左侧的pivot(5),值大于右侧的pivot,值为[0 3 4 2 1 5 8 6 7 9]。但是,当我尝试自己完成这些步骤时,我会继续[ 4 0 3 1 2 5 6 8 7 9 ]

我采取的程序是:

5 9 3 8 6 4 2 1 7 0 // The initial list. Pivot = 5
5 0 3 8 6 4 2 1 7 9 // Switched 0 and 9.
5 0 3 1 6 4 2 1 7 9 // Switched 8 and 1
5 0 3 1 2 4 6 8 7 9 // Switched 6 and 2
4 0 3 1 2 5 6 8 7 9 // Switched 4 and 5 because the lines that point to the 
                    // greater and smaller numbers crossed.

我的错误在哪里?另外,我看到左边的数字小于5,右边的数字大于5,所以,我的错误是否真的影响排序?

3 个答案:

答案 0 :(得分:3)

SparkNotes中描述的算法最初将pivot元素放置到数组中最右边的位置。您使用的算法放置/保持枢轴到最左侧位置。难怪分区后的安排是不同的。

这意味着他们从

开始
5 9 3 8 6 4 2 1 7 0

选择5作为支点并将其置于最右侧位置(已交换50

0 9 3 8 6 4 2 1 7 5

之后,他们才对其余元素进行分区。

你将5放在最左边的位置(显然你只是忘了从SparkNotes做第2步)。最后,两种变体都有效,即没有“错误”。在您的情况下,排列完全有效,阵列正确分区。

答案 1 :(得分:1)

Here您可以看到Quick-sort算法的直观实现。

也许你也会觉得有用:

如果你讨厌匈牙利民间舞蹈,不要去链接。 :)

答案 2 :(得分:0)

您没有遵循sparknotes网站上提供的确切算法。他们的第二步要求您将枢轴与最后一个元素交换。

在任何情况下,只要你将序列分开使得枢轴之前的所有元素都小于(或等于)到枢轴,并且跟随它的那些元素是完全执行分区的算法是无关紧要的。更大(或相等)。当您对结果分区进行递归排序时,最终会得到一个排序序列。

这是一个效率问题,而不是正确性,你如何处理相同的元素以及如何选择枢轴,以及你最终切换到另一个算法的序列长度。