我正在尝试编写quicksort算法。我按照一个在线教程完成了同样的事情,但我收到了StackOverFlow错误。
public void mysort(int[] g) {
quickSort(g, 0, g.length - 1);
System.out.println(Arrays.toString(g));
}
public void quickSort(int[] nums, int low, int high) {
int i = low;
int j = high;
int pivot = nums[(low + (high - low)) / 2];
while (i <= j) {
while (nums[i] < nums[pivot]) {
i++;
}
while (nums[j] > nums[pivot]) {
j--;
}
while (i <= j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
System.out.println(Arrays.toString(nums));
if (low < j) {
quickSort(nums, low, j);
}
if (i < high) {
quickSort(nums, i, high);
}
}
我作为参数传递的数组是[1,2,3,4,5,5,4,3,2,1]。
在quicksort方法中,println语句在第一个循环后输出[1,4,3,2,1,2,3,4,5,5]。
这里发生了什么?
答案 0 :(得分:3)
您正在计算枢轴错误,但不是:
int pivot = nums[(low + (high - low)) / 2];
是:
int pivot = nums[low + ((high - low) / 2)];
数学中的 Division
优先级高于sum
和sub
换句话说,你可以把它写成:
int pivot = nums[low + (high - low) / 2];
你会发现另一个问题,就是在你的时间里,你不是要求枢轴,你要求在枢轴nums[pivot]
位置的号码,它应该是:
while (array[i] < pivot) {
i++;
}
while (array[j] > pivot) {
j--;
}
最后,不是交换while i<=j
:
if (i <= j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}