我的mergeSort实现有问题

问题描述

我对mergeSort的实现遇到了错误,但我不知道为什么。这是确切的错误消息:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1"

这是我对mergeSort的实现:

public static void mergeSort(int[] arr,int n) {
    if (n < 2) {
        return;
    }
    
    int mid_index = n / 2; 
    int[] left = new int[mid_index];
    int[] right = new int[n - mid_index];
    
    for (int i = 0; i < mid_index; i++) {
        left[i] = arr[i];
    }
    
    for (int i = mid_index; i < n; i++) {
        right[i - mid_index] = arr[i];
    }
    
    mergeSort(left,mid_index);
    mergeSort(right,n - mid_index);
    merge(arr,left,right,mid_index,n - mid_index);
}
    
public static void merge(int[] arr,int[] left,int[] right,int left_length,int right_length) {
    int i = 0;
    int j = 0; 
    int k = 0; 
    
    while (j < left_length && k < right_length) {
        if (left[i] < right[j]) {
            arr[k] = left[i];
            k++;
            i++;
        } else {
            arr[k] = right[j];
            k++;
            j++;
        }
    }
    
    while (j < left_length) {
        arr[k] = left[i];
        k++;
        i++;
    }
    
    while (i < right_length) {
        arr[k] = right[j];
        k++;
        j++;
    }
} 

解决方法

问题出在merge方法中。您在索引上犯了一些错误。我在下面的代码中更正了它们

public static void merge(int[] arr,int[] left,int[] right,int left_length,int right_length){
    int i = 0;//left
    int j = 0; //right
    int k = 0; 
    
    while(i<left_length && j < right_length){
        if(left[i] < right[j]){
            arr[k] = left[i];
            k++;
            i++;
        }
        else{
            arr[k] = right[j];
            k++;
            j++;
        }
    }
    
    while(i<left_length){
        arr[k] = left[i];
        k++;
        i++;
    }
    
    while(j<right_length){
        arr[k] = right[j];
        k++;
        j++;
        }
    } 
,

while方法中的所有3 merge循环都使用了错误的索引变量。第一个循环while (j < left_length && k < right_length) {应该是

    while (i < left_length && j < right_length) {

第二个循环while (j < left_length) {应该是

    while (i < left_length) {

最后,最后一个循环while (i < right_length) {应该是

    while (j < right_length) {

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...