Quicksort偶尔没有完成?

时间:2015-04-27 19:52:34

标签: java algorithm sorting quicksort

我已经尝试了一种快速排序算法,我似乎无法开始工作。这段代码是我最接近的代码,除了大约五分之一它没有完全排序 - 它输出类似266, 186, 219, 276, 357, 405, 686, 767, 834, 862的内容。我试图找到这样做的所有数字组之间的共性,但我找不到任何东西。我花了很多时间用调试器踩过它但却看不到任何东西(虽然我觉得我错过了一些明显的东西)。我做错了什么?

public static void sort(ArrayList<Integer> arr, int left, int right) {
    int i = left - 1, j = right, v = arr.get(right);
    if(right - i == 0 || right - i == 1)return;

    for(;;) {
        while(arr.get(++i) < v);
        while(v < arr.get(--j) && j != 0)
            if(j == 1)break;
        if(i >= j)break;

        Collections.swap(arr, i, j);
    }
    Collections.swap(arr, i, right);

    sort(arr, left, i - 1);
    sort(arr, i, right);
}

1 个答案:

答案 0 :(得分:2)

我为你的代码做了两件事来让它工作:

在方法集j = right +1的开头 并在第一个if语句后移动v = arr.get(right)

应该是这样的:

public static void sort(ArrayList<Integer> arr, int left, int right) {
        int i = left - 1;
        int j = right + 1;
        if (right - i == 0 || right - i == 1) return;
        int v = arr.get(right);

        for (;;) {
            while (arr.get(++i) < v);
            while (v < arr.get(--j) && j != 0)
                if (j == 1) break;
            if (i >= j) break;

            Collections.swap(arr, i, j);
        }
        Collections.swap(arr, i, right);

        sort(arr, left, i - 1);
        sort(arr, i, right);
    }

但这是非常难以理解的代码,你应该阅读CleanCode一书。

相关问题