array 索引越界 java 中的合并排序异常 [duplicate]

array Index Out Of Bounds Exception in merge sort in java [duplicate]

提问人:Dhairya Gupta 提问时间:9/17/2023 更新时间:9/17/2023 访问量:27

问:

我在 java 中为合并排序编写了这段代码,我尝试仅使用一个辅助数组来使用合并排序。但它会导致数组越界异常。请帮我修复带有 1 个辅助数组的 mergeSort 代码。

public static void mergeSort(int arr[], int s, int e){
        if(s < e){
            int mid = s + (e-s)/2;

            mergeSort(arr, s, mid);
            mergeSort(arr, mid+1, e);

            merge(arr, s, mid, e);
        }
    }

    public static void merge(int arr[], int s, int mid, int e){
        int arr2[] = new int[arr.length];
        for(int i = 0;i <= e; i++){
            arr2[i] = arr[i];
        }

        int i = 0, j = mid+1, k = s;

        while(i < mid+1 && j < e+1){
            if(arr2[i] < arr2[j])   arr[k++] = arr2[i++];
            else    arr[k++] = arr2[j++];
        }

        while(i < mid+1)    arr[k++] = arr2[i++];
        while(j < e+1)  arr[k++] = arr2[j++];
    }
Java 合并排序

评论


答:

1赞 JJY9 9/17/2023 #1

您的代码中存在一个微妙的错误。在 merge 方法中,你使用不同的索引来迭代 arr2 和 arr。这是 ArrayIndexOutOfBoundsException 的主要原因。

若要修复代码,请注意以下几点:

从 arr 复制到 arr2 时,您应该只将元素从 s 复制到 e,而不是整个数组。 对于 arr2,索引 i 和 j 应分别从 s 和 mid + 1 开始。

下面是合并方法的更正版本:

public static void merge(int arr[], int s, int mid, int e){
    int arr2[] = new int[arr.length];
    for(int i = s; i <= e; i++){
        arr2[i] = arr[i];
    }

    int i = s, j = mid + 1, k = s;

    while(i <= mid && j <= e){
        if(arr2[i] < arr2[j]) arr[k++] = arr2[i++];
        else arr[k++] = arr2[j++];
    }

    while(i <= mid) arr[k++] = arr2[i++];
    while(j <= e) arr[k++] = arr2[j++];
}