java快速排序算法实现中的错误

时间:2014-09-12 07:40:31

标签: java quicksort

不知何故,我的输入的最后一个元素没有按照我提供给quicksort方法的列表进行排序 例如

输入:5,7,3,2,7,8,9,0,3,1,2,3
结果:0 1 2 2 3 3 5 7 7 8 9 3

输入:5,4,2,12,9,5
结果:2 4 5 9 12 4

我出错的任何想法?

public class QuickSort2 {

    private static void quickSort(int[] list) {
        quickSort(list, 0, list.length - 1);
    }

    private static void quickSort(int[] list, int p, int q) {
        if (p < q) {
            int pivotIndex = partition(list, p, q);
            quickSort(list, p, pivotIndex - 1);
            quickSort(list, pivotIndex + 1, q);
        }
    }

    private static int partition(int[] list, int p, int q) {
        int x = list[p];
        int i = p;
        int temp, temp2;
        for (int j = p + 1; j < list.length - 1; j++) {
            if (list[j] < x) {
                i = i + 1;
                // exchange list[i] with list[j]
                temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
        // exchange list[p] with list[i]
        temp2 = list[p];
        list[p] = list[i];
        list[i] = temp2;
        return i;
    }
}

修改

public class QuickSort2 {

    private static void quickSort(int[] list) {
        quickSort(list, 0, list.length - 1);
    }

    private static void quickSort(int[] list, int p, int q) {
        if (p < q) {
            int pivotIndex = partition(list, p, q);
            quickSort(list, p, pivotIndex - 1);
            quickSort(list, pivotIndex + 1, q);
        }
    }

    private static int partition(int[] list, int p, int q) {
        int x = list[p];
        int i = p;
        int temp, temp2;
        for (int j = p + 1; j <= q; j++) {
            if (list[j] < x) {
                i = i + 1;
                // exchange list[i] with list[j]
                temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
        // exchange list[p] with list[i]
        temp2 = list[p];
        list[p] = list[i];
        list[i] = temp2;
        return i;
    }
}

1 个答案:

答案 0 :(得分:4)

您的for循环“跳过”最后一个元素:

for (int j = p + 1; j < list.length - 1; j++)

像这样修改:

for (int j = p + 1; j < list.length; j++)

顺便说一句,它不应该是list.length,因为那样你就是在做不必要的工作。您应该在[p..q](包括两者)范围内工作,而不是在整个阵列上工作,所以这就足够了:

for (int j = p + 1; j <= q; j++)

你的实现(即使它有效)看起来很典型。看看Quicksort