我正在写一个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

最佳答案

在排序交换期间,“ 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);
    }
}

关于java - 降序Quicksort只能完成一半,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27206354/

10-12 16:58