我尝试实现这种快速排序算法但是即使它正确编译,我得到ArrayIndexOutOfBoundsException
public class MyQuickSort {
private int array[];
private int length;
public void sort(int[] inputArr) {
if (inputArr == null || inputArr.length == 0)
return;
this.array = inputArr;
length = inputArr.length;
quickSort(0, length-1);
}
private void quickSort(int lowerIndex, int higherIndex) {
int i = lowerIndex;
int j = higherIndex;
int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
while (i<=j) {
while (array[i] < pivot) {
i++;
}
while (array[j] > pivot) {
j--;
}
if (i <= j) {
exchangeNumbers(i, j);
i++;
j++;
}
}
if (lowerIndex < j)
quickSort(lowerIndex,j);
if (j <higherIndex)
quickSort(i, higherIndex);
}
private void exchangeNumbers(int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String a[]) {
MyQuickSort sorter = new MyQuickSort();
int[] input = {10,9,8,7,6,5,4,3,2,1};
sorter.sort(input);
for(int i:input)
System.out.println(i);
}
}
以下是例外:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at MyQuickSort.quickSort(MyQuickSort.java:23)
at MyQuickSort.sort(MyQuickSort.java:11)
at MyQuickSort.main(MyQuickSort.java:48)
答案 0 :(得分:2)
j
可能会超出范围。
if (i <= j) {
exchangeNumbers(i, j);
i++;
j++;
}
答案 1 :(得分:2)
后:
int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
pivot
现在是6
后:
while (array[j] > pivot) {
j--;
}
array[j]
是1
,所以这个循环永远不会执行。
然后,因为i=0
和j=9
,i<=j
,所以程序调用{{1}},所以j++;
现在是10.然后,{{1} (因为j
),所以你再次使用lowerIndex < j
调用该函数,这会导致0<10
。
答案 2 :(得分:0)
替换行:
if (j <higherIndex)
使用:
if (i <higherIndex)