快速排序算法不起作用

时间:2014-03-13 15:40:59

标签: java sorting quicksort indexoutofboundsexception

我尝试实现这种快速排序算法但是即使它正确编译,我得到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)

3 个答案:

答案 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=0j=9i<=j,所以程序调用{​​{1}},所以j++;现在是10.然后,{{1} (因为j),所以你再次使用lowerIndex < j调用该函数,这会导致0<10

答案 2 :(得分:0)

替换行:

if (j <higherIndex)

使用:

if (i <higherIndex)