降序Quicksort只有一半有效

时间:2014-11-29 19:47:56

标签: java sorting quicksort

我正在编写一个quicksort方法来按降序对整数数组进行排序。它有点工作,但有一些数字最终不合适。我无法理解,因为我是排序新手,所以任何帮助都会受到很多赞赏!

public static void quikSort(int[] nums, int left, int right) {
    int pivotIndex = (left + right) / 2;
    int l = left;
    int r = right;
    int temp;
    while (l <= r) {
        while (nums[l] > nums[pivotIndex]) {
            l++;
        }
        while (nums[r] < nums[pivotIndex]) {
            r--;
        }

        if (l <= r) {
            temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l++;
            r--;
        }
    }
    if (left < r) {
        quikSort(nums, left, r);
    }
    if (l < right) {
        quikSort(nums, l, right);
    }
}

这里也是一些示例输出(有时输出最终完美排序,但并非总是如此):

0:9676

1:5065

2:3204

3:-2164

4:-6511

5:8782

6:1748

7:-3130

8:-8420

9:-9233

从该计划的另一次运行中:

0:5360

1:2221

2:426

3:2180

4:818

5:-1828

6:-2452

7:-3953

8:-4919

9:-5442

1 个答案:

答案 0 :(得分:1)

在排序交换期间,'nums [pivotIndex]'的值可以更改。改为使用固定支点:

public static void quickSort(Integer[] nums, int left, int right) {
    final int pivot = nums[(left + right) / 2]; // <== Fix pivot value.
    int l = left;
    int r = right;
    while (l <= r) {
        while (nums[l] > pivot) {
            l++;
        }
        while (nums[r] < pivot) {
            r--;
        }
        if (l <= r) {
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
            l++;
            r--;
        }
    }
    if (left < r) {
        quickSort(nums, left, r);
    }
    if (l < right) {
        quickSort(nums, l, right);
    }
}