Quicksort比Java中的插入和选择排序慢吗?

时间:2014-04-04 22:34:09

标签: java performance algorithm sorting quicksort

所以我正在刷新我的算法知识并测试不同种类的运行时,我发现我的快速排序实现比插入和选择排序要快得多。算法看起来对我来说,它在实践中看起来与我在网上找到的其他几个实现相同。但它必须以某种方式出错,因为它的排序比O(N ^ 2)排序慢500倍。对随机10000元素数组的3(深)副本进行排序时,给出:

插入排序:(75355000 ns)

选择排序:(287367000 ns)

快速排序:(44609075000 ns)

以下是代码:

public static void quickSort(Thing [] theThings, int left, int right) {
    int i= left; int j = right;
    int pivot = theThings[(int)(left + (right-left)*0.5)].getValue();

    while (i <= j) {
        while (theThings[i].getValue() < pivot)
            i++;
        while (theThings[j].getValue() > pivot)
            j--;

        if (i <= j) {
            Thing temp = theThings[i];
            theThings[i] = theThings[j];
            theThings[j] = temp;

            i++;
            j--;
        }

        if (left < j)
            quickSort(theThings, left, j);
        if (right > i)  
            quickSort(theThings, i, right);
    }                   
}

Thing类只是我在算法中使用的假人。它在构造函数中有一个由Random生成的整数值,而不是其他的。

我已经验证了快速排序对数组进行了正确的排序 - 比它应该慢得多。我尝试过不同的枢轴选择方法。我已经尝试了我能想到的一切。也许我太接近了,但是有谁能告诉我什么是杀死我的算法?

1 个答案:

答案 0 :(得分:5)

while循环完成后,您应该递归以快速排序数组的每个部分,而不是每次都通过while循环。