【问题标题】:Getting StackOverflowError when running my Merge Sort function (Java)运行合并排序功能时出现 StackOverflowError (Java)
【发布时间】:2018-02-05 06:28:00
【问题描述】:

我正在尝试实现合并排序功能,但在尝试运行它时收到 StackOverflowError 异常。我看到了另一个与我类似的问题,答案是关于更改中点的计算方式。我试图更改中点,但仍然遇到相同的 stackoverflow 错误。

感谢收看。

public static void mergeSort(int [] arr, int low, int high) {

        if (low < high) {
            int mid = (low + high)/2;

            mergeSort(arr, low, mid + 1);
            mergeSort(arr, mid, high);          
            merge(arr, low, mid, high);
        }
    }

    public static void merge(int [] arr, int low, int mid, int high) {

        int n1 = mid - low + 1;
        int n2 = high - mid;

        int [] leftArr = new int[n1];
        int [] rightArr = new int[n2];

        for (int i = 0; i < n1; i++) leftArr[i] = arr[low + i];
        for (int j = 0; j < n2; j++) rightArr[j] = arr[mid + j + 1];

        int i = 0;
        int j = 0;

        int k = 1;

        while (i < n1 && j < n2) {
            if (leftArr[i] < rightArr[j]) {
                arr[k] = leftArr[i++];
            }
            else {
                arr[k] = rightArr[j++];
            }
            k++;
        }
        while (i < n1) arr[k++] = leftArr[i++];
        while (j < n2) arr[k++] = rightArr[j++];
    }

【问题讨论】:

  • 您的merge 方法包含lowhigh,所以您的意思可能是mergeSort(arr, low, mid - 1);,而不是+ 1。如果你调用mergeSort(x, 0, 2),它将计算mid = 1,所以你调用mergeSort(x, 0, 2)mergeSort(x, 1, 2),当你应该调用mergeSort(x, 0, 0)mergeSort(x, 1, 2)时,因为第一次调用是无限递归.稍微调试会告诉你的事情!!!!

标签: java stack-overflow mergesort


【解决方案1】:

你错误地实现了你的归并排序函数。它应该是这样的

if (low < high) {
        int mid = (low + high)/2;

        mergeSort(arr, low, mid -1);
        mergeSort(arr, mid, high);          
        merge(arr, low, mid, high);
    }

并且在合并函数中你已经初始化了

k=1;

但应该是

k=low;

因为如果您每次都初始化 k=1,那么它将覆盖数组元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多