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