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