quicksort算法相等元素怎样处理

Algorithms (4th Edition)2.3.3.3小节: Entropy-optimal sorting. 方法是三向切分的快速排序。更好实现3向切分的方法需要查看练习2.3.22.Quick3way.java
■网友
这个看怎么实现快排了,如果是一般教科书上的朴素实现,相当于一个两重循环,是退化的情况。
■网友
不随机划分的快排最差输入为正序或者倒序。全部相同的数据不论怎么划分,都可视为正序或者倒序。所以,为最差输入。
■网友
正常实现的快排都是三分成 \u0026lt; , = , \u0026gt; ,实现上没什么很大的差别。因此这种输入无论如何都是一遍结束,是best case。不过这种输入没什么意义了,因此一般测试的时候都不会用这种input。
■网友
大量的相同元素会让Naive版本的快速排序退化到 O(n^2)Dutch national flag problem这个分割元素的方法可以解决这个问题。
■网友
如果是二分成的实现的话, 好的处理方式是相等元素也参与交换, 虽然可能会增加总的交换次数, 但是如果不参与交换可能会导致非常糟糕的性能, 一个例子就是你说的元素全相等的情况, 这样整个算法立马就会退化成一个 O(N^2) 算法。看有一点大家都没提, 就是虽然元素全相等的情况不太可能会发生, 但是在实际应用当中, 10000 个元素里有几千个元素相等这种情况, 未必是小概率事件以前写过一篇文章详细分析过这个问题, 有兴趣可以一起讨论: http://cifer.me/2016/07/24/quick-sort/
■网友
话说全部相等的话也可以视为乱序吧?也可以搞成标准的nlognint k=a;while(l\u0026lt;=r){while(l\u0026lt;=r){if(a\u0026lt;=k){swap(a,a);break;}--r;} while(l\u0026lt;=r){ if(a\u0026gt;=k){swap(a,a);break;} ++l; } if(l==r) break;}


    推荐阅读