不知何故,我的输入的最后一个元素没有按照我提供给quicksort方法的列表进行排序
例如
输入:5,7,3,2,7,8,9,0,3,1,2,3
结果:0 1 2 2 3 3 5 7 7 8 9 3
输入:5,4,2,12,9,5
结果:2 4 5 9 12 4
我出错的任何想法?
public class QuickSort2 {
private static void quickSort(int[] list) {
quickSort(list, 0, list.length - 1);
}
private static void quickSort(int[] list, int p, int q) {
if (p < q) {
int pivotIndex = partition(list, p, q);
quickSort(list, p, pivotIndex - 1);
quickSort(list, pivotIndex + 1, q);
}
}
private static int partition(int[] list, int p, int q) {
int x = list[p];
int i = p;
int temp, temp2;
for (int j = p + 1; j < list.length - 1; j++) {
if (list[j] < x) {
i = i + 1;
// exchange list[i] with list[j]
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
// exchange list[p] with list[i]
temp2 = list[p];
list[p] = list[i];
list[i] = temp2;
return i;
}
}
修改
public class QuickSort2 {
private static void quickSort(int[] list) {
quickSort(list, 0, list.length - 1);
}
private static void quickSort(int[] list, int p, int q) {
if (p < q) {
int pivotIndex = partition(list, p, q);
quickSort(list, p, pivotIndex - 1);
quickSort(list, pivotIndex + 1, q);
}
}
private static int partition(int[] list, int p, int q) {
int x = list[p];
int i = p;
int temp, temp2;
for (int j = p + 1; j <= q; j++) {
if (list[j] < x) {
i = i + 1;
// exchange list[i] with list[j]
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
// exchange list[p] with list[i]
temp2 = list[p];
list[p] = list[i];
list[i] = temp2;
return i;
}
}
答案 0 :(得分:4)
您的for
循环“跳过”最后一个元素:
for (int j = p + 1; j < list.length - 1; j++)
像这样修改:
for (int j = p + 1; j < list.length; j++)
顺便说一句,它不应该是list.length
,因为那样你就是在做不必要的工作。您应该在[p..q]
(包括两者)范围内工作,而不是在整个阵列上工作,所以这就足够了:
for (int j = p + 1; j <= q; j++)
你的实现(即使它有效)看起来很典型。看看Quicksort。