天真的快速排序将花费O(n ^ 2)时间对不包含唯一键的数组进行排序,因为所有键都将在数据透视值之前或之后进行分区。有办法处理重复键(如Quicksort is Optimal中所述)。建议的解决方案仅适用于Hoare分区,但我实现了Lomuto分区。为了处理重复的键,我在移动重复项到枢轴的左边并将重复项移动到数据库的右侧之间进行交替。该算法的工作原理如下:
//partition array from index start to end
select pivot element and move it to array[start]
boolean dupHandler=true;
int index=start;
for(i from start+1 to end)
int val=array[start].compareTo(array[i]);
if(val==0)
if(dupHandler)
swap array[++index] and array[i]
dupHandler=!dupHandler;
else if(val>0)
swap array[++index] and array[i]
swap array[start] and array[index]
是否有更好(更有效)的方法来处理重复的密钥?
编辑:我的代码(如图所示)要求compareTo与equals一致(即使认为不是要求)