Quicksort / Insertion排序组合比Quicksort更慢?

时间:2011-12-04 22:05:20

标签: java algorithm quicksort insertion-sort

我运行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 []数组

4 个答案:

答案 0 :(得分:7)

OptQSort2中,对于小分区,您可以调用以下函数:

InsertionSort.sort(data);

这应该插入小分区吗?看起来您正在对整个数组进行排序。您不应该将minmax索引传递给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后。