我运行Quicksort 10次,得到平均时间。 我为Qicksort / Insertion排序组合做同样的事情,它似乎比quicksort慢。
这是我调用InsertionSort
的代码部分public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
int indexofpartition;
if(max - min > 0) {
if( (max - min) <= 10) {
// Use InsertionSort now
InsertionSort.sort(data);
return;
} else {
indexofpartition = findPartition(data, min, max);
OptQSort2(data, min, indexofpartition - 1);
OptQSort2(data, indexofpartition + 1, max);
}
}
}
常规Quicksort与上面的代码片段相同,但没有调用InsertionSort的if条件。
FindPartition如下:
public static <T extends Comparable<? super T>> int findPartition(T[] data, int min, int max) {
int left, right;
T temp, partitionelement;
int middle = (min + max)/2;
partitionelement = data[middle];
left = min;
right = max;
while(left < right) {
while(data[left].compareTo(partitionelement) <= 0 && left < right)
left++;
while(data[right].compareTo(partitionelement) > 0)
right--;
if(left < right) {
temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
Quicksort和OptSort2(使用插入排序)的平均时间是
Sorted using QuickSort in: 3858841
Sorted using OptQSort2 in: 34359610
任何想法为什么?序列的大小是否重要?我正在为此
使用1000个元素的Integer []数组答案 0 :(得分:7)
在OptQSort2
中,对于小分区,您可以调用以下函数:
InsertionSort.sort(data);
这应该插入小分区吗?看起来您正在对整个数组进行排序。您不应该将min
和max
索引传递给InsertionSort
吗?
另一种选择是在OptQSort2
期间对小分区不起作用。然后在InsertionSort
完成工作后,对整个数组执行单OptQSort2
次传递。
答案 1 :(得分:1)
您需要一个更大的整数数组才能使测试具有相关性。此时,可能测试if条件会使QS + IS情况下的算法变慢。
测试大量数字并在数据大小足以容纳L1缓存(即32-64kb)时切换到IS。
答案 2 :(得分:1)
第一个嫌疑人显然是你的插入排序方法。它真的很合适吗?
您还需要对其进行10次以上的测试才能预热JVM。并且还要在两个订单中对它们进行测试,这样一方就不会受益于另一方的预热。我会建议100或1000次测试。而且它们也必须都在同一个数据集上。
答案 3 :(得分:0)
每次拥有最多10个元素的子数组时,不应该调用InsertionSort
。什么都不做:
public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
int indexofpartition;
if( (max - min) > 10) {
indexofpartition = findPartition(data, min, max);
OptQSort2(data, min, indexofpartition - 1);
OptQSort2(data, indexofpartition + 1, max);
}
}
完成对整个阵列的调用InsertionSort
后。