运行合并排序函数(Java)时获取StackOverflowError

时间:2018-02-05 06:28:01

标签: java stack-overflow mergesort

我正在尝试实现合并排序功能,并在尝试运行时收到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++];
    }

1 个答案:

答案 0 :(得分:1)

您实现了mergesort函数wrong.it应该是这样的

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,那么它将覆盖数组元素。