快速排序比合并排序慢

时间:2019-04-08 00:56:46

标签: quicksort

我认为在排列具有重复数据的数组时,快速排序的速度效率较低,对吗?当数据类型为char时,数组越大(超过100000),它越接近n ^ 2阶。 并假设没有重复数据,为了获得快速排序的最佳情况,其中第一个元素被放置为枢轴,第一个元素我认为我们可以通过像合并排序一样划分已对齐的数组来递归地更改第一个和中间元素。对?有一般的最佳情况吗?

1 个答案:

答案 0 :(得分:0)

Lomuto分区方案在分区期间从一端扫描到另一端,但是重复比较慢。如果所有值都相同,则每个分区步骤会将其分为大小1和n-1,这是最坏的情况。

Hoare分区方案从两端向彼此扫描直到索引(或迭代器或指针)交叉,通常在重复项下速度更快。即使重复操作会导致更多交换,但每次交换都会在读取两个值并将其与数据透视表进行比较之后发生,并且仍在缓存中进行交换(假设对象大小不大)。随着重复次数的增加,分裂朝着理想的情况改善,在理想情况下,每个分区步骤将数据分为两个相等的一半。我运行了一个基准测试,对1千6百万个64位整数进行了排序:使用随机数据,它花费了大约1.37秒,而使用重复数据进行了改进,而所有值都相同,则花费了大约0.288秒。

另一种选择是三向分区,它将一个分区拆分为元素<枢轴,元素==枢轴,元素>枢轴。如果所有元素都相同,则在O(n)时间内完成。对于只有k个可能值的n个元素,时间复杂度为O(n log3(k)⌉),并且由于k为常数,因此时间复杂度仍为O(n)。

Wiki链接:

https://en.wikipedia.org/wiki/Quicksort#Repeated_elements

https://en.wikipedia.org/wiki/Dutch_national_flag_problem