Algorithm 为什么快速排序单轴比三向分区快?

Algorithm 为什么快速排序单轴比三向分区快?,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,我试图粗略地测试QuickSorts(单轴、三向和双轴)的性能 问题1: 恐怕我在实现3路分区时遗漏了一些东西。在对随机输入(1000万个)数字的多次运行中,我可以看到单个枢轴总是表现得更好(尽管1000万个数字的差异大约在100毫秒左右) 我知道3路的全部目的不是在重复键上实现0(n^2)性能,这在我针对重复输入运行3路时非常明显。但是,为了处理重复的数据,三方是否真的会受到轻微的惩罚?还是我的实现不好 重复数据: 快速排序基本值:888毫秒 快速分拣3路:522毫秒 快速分拣双枢轴:482

我试图粗略地测试QuickSorts(单轴、三向和双轴)的性能

问题1: 恐怕我在实现3路分区时遗漏了一些东西。在对随机输入(1000万个)数字的多次运行中,我可以看到单个枢轴总是表现得更好(尽管1000万个数字的差异大约在100毫秒左右)

我知道3路的全部目的不是在重复键上实现0(n^2)性能,这在我针对重复输入运行3路时非常明显。但是,为了处理重复的数据,三方是否真的会受到轻微的惩罚?还是我的实现不好

重复数据:

  • 快速排序基本值:888毫秒
  • 快速分拣3路:522毫秒
  • 快速分拣双枢轴:482毫秒
随机数据:

  • 基本快速排序:1677毫秒
  • 快速分拣3路:1717毫秒
  • 快速分拣双枢轴:1595毫秒
问题2:

双枢轴实现(下面的链接)不能很好地处理重复项。执行该命令需要0(n^2)个时间。有没有快速前进的好方法。我可以看出,我们可以检查枢轴是否相等,并增加枢轴1,直到它与枢轴2不同。这是公平的执行吗

else if (pivot1==pivot2){
        while (pivot1==pivot2 && lowIndex<highIndex){
            lowIndex++; 
            pivot1=input[lowIndex];
        }
    }
else if(pivot1==pivot2){

而(pivot1==pivot2&&lowIndex首先要去掉构造函数中的suffle,以获得正确的比较

第二,这种行为是预期的,因为在基本版本中,只有在双方都找到合适的候选者时,才进行切换,即在QuickSortBasic.java中

    while (true){

        while (less(input[++i], input[pivotIndex])){
            if (i==highIndex) break;
        }

        while (less (input[pivotIndex], input[--j])){
            if (j==lowIndex) break;
        }

        if (i>=j) break;

        exchange(input, i, j);

    }
而在3way版本中,除非元素等于pivot(即在QuickSort3Way.java中),否则无论如何都要进行切换

    while (i<=gt){


        if (less(input[i],pivotValue)){
            exchange(input, i++, lt++);
        }
        else if (less (pivotValue, input[i])){
            exchange(input, i, gt--);
        }
        else{
            i++;
        }


    }

虽然(iAnswers旨在对OP以外的其他人有用。“检查你的github pull请求”对下一个阅读此答案的人来说不是很有用,6个月后不会…)但OP的工作如下。。。