我正在编写一个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
答案 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);
}
}