快速排序 Java 。 ArrayIndexoutofBoundsException异常

Quick Sort Java . ArrayIndexoutofBoundsException

我想快速排序 algoritm.I 正在学习快速排序算法。

Out: ArrayIndexoutofBoundsException error.I 找不到错误。

我不好English.Sorry。 我该如何解决这个问题?

public class Quickort {
static int partition(int arr[],int left,int right){
    int i=left;
    int j=right;
    int tmp;    
    int pivot=(left/right)/2;
    while(i<=j){
        while(arr[i]<pivot)
            i++;
        while(arr[j]>pivot)
            j--;

        if(i<=j){
        tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
        i++;
        j--;
        }
     }
    return i;
}
static void quicksort(int arr[],int left,int right){
int index=partition(arr,left,right);

if(left<index-1)
    quicksort(arr, left, index-1);
if(index<right)
quicksort(arr, index, right);


}


public static void main(String[] args) {
    int [] arr={8,4,1,7,9,4,3,2,5};
    quicksort(arr,0,arr.length-1);


}

}

int pivot=(left/right)/2;更改为int pivot=(left+right)/2;

根据你的代码

  int pivot=(left/right)/2;

您将获得零的枢轴。因为这个循环

while(arr[j]>pivot)
        j--;

j 变为 -1 并且由于数组不包含它,它抛出 ArrayIndexoutofBoundsException

枢轴变量的值应该是数组中的一个元素 (int pivot = arr[right];)。

试试这个:

static int partition(int arr[], int left, int right) {
    int pivot = arr[right];
    int i = left - 1;
    int tmp;
    for (int j = left; j <= right; j++) {
        if (arr[j] <= pivot) {
            i++;
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }
    return i;
}

static void quicksort(int arr[], int left, int right) {
    if(left < right){
        int index = partition(arr, left, right);
        quicksort(arr, left, index - 1);
        quicksort(arr, index + 1, right);
    }
}