java - 归并排序java实现错误

标签 java recursion mergesort

好的,所以我尝试在java中实现合并排序,但是在数组的分割中遇到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: 2 > 1
    at java.util.Arrays.copyOfRange(Arrays.java:3591)
    at MergeSortS.recMergeSort(MergeSortS.java:26)
    at MergeSortS.recMergeSort(MergeSortS.java:28)
    at MergeSortS.mergeSort(MergeSortS.java:17)
    at MergeSortM.main(MergeSortM.java:16)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)

我的代码段如下,请帮我确定我的问题...:( 我特意在最后注释掉了 recMergeSort(right) 递归调用,因为我想更正 recMergeSort(left) 调用...

public void recMergeSort(int[] tempArray){
        if(tempArray.length>1){
            int mid=(tempArray.length)/2;

            int[] left=Arrays.copyOfRange(tempArray,0,mid);

            int[] right=Arrays.copyOfRange(tempArray,mid+1,tempArray.length-1);

            recMergeSort(left);
            //recMergeSort(array, right, mid+1, right.length-1);
        }
    }

编辑 好的,所以我检查了另一个网站和 copyOfRange 方法上的 javadoc,需要以下内容:

Parameters:
original - the array from which a range is to be copied
from - the initial index of the range to be copied, **inclusive**
to - the final index of the range to be copied, **exclusive**. (This index may lie outside the array.)

按如下方式修复此问题后:

public void recMergeSort(int[] tempArray){
        if(tempArray.length>1){
            int mid=(tempArray.length)/2;

            int[] left=Arrays.copyOfRange(tempArray,0,mid+1);

            int[] right=Arrays.copyOfRange(tempArray,mid+1,tempArray.length);

            recMergeSort(left);
            //recMergeSort(array, right, mid+1, right.length-1);
        }
    }

我收到以下错误:

Exception in thread "main" java.lang.StackOverflowError

请帮我纠正这个问题...:(

最佳答案

您似乎陷入了 Arrays.copyOfRange() 方法的困境。请尝试使用以下代码:

public void recMergeSort(int[] tempArray){
    if (tempArray.length > 1 ){
        int mid=(tempArray.length)/2;                                       // mid = 2
        int[] left = Arrays.copyOfRange(tempArray, 0, mid);                 // [10, 20]
        int[] right = Arrays.copyOfRange(tempArray, mid, tempArray.length); // [30, 40, 50]

        recMergeSort(left);
        //recMergeSort(array, right, mid+1, right.length-1);
    }
}

Arrays.copyOfRange(array, lowIndex, highIndex) 将从 lowIndex inclusivehighIndex 复制访问> 独家。这意味着左侧副本的 highIndex 应与右侧副本的 lowIndex 相同

用法:

int[] tempArray = new int[] {10, 20, 30, 40, 50};
recMergeSory(tempArray);

关于java - 归并排序java实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31019683/

相关文章:

java - AndroidStudio Retrofit2 响应获取数据

c# - int ref 参数是否被装箱?

python - 合并排序实现以按字符串长度排序 - python

c - 抛出未处理的异常 : write access violation

java - python 从套接字接收

java - 检查十六进制字符串仅包含十六进制有界值

javascript - Javascript通过递归获取根元素

C++ 递归段错误。你能帮我看看我做错了什么吗?

performance - MergeSort 中的两个递归调用是什么?

java - 使用Socket编程发送文件(大)