代码之家  ›  专栏  ›  技术社区  ›  user2411290

运行我的合并排序函数时获取StackOverflowerError(Java)

  •  -1
  • user2411290  · 技术社区  · 7 年前

    我正在尝试实现一个合并排序函数,并且在尝试运行它时收到一个StackOverflowerError异常。我看到了另一个与我类似的问题,答案是关于改变中点的计算方式。我试图更改中点,但仍然得到相同的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 回复  |  直到 7 年前
        1
  •  1
  •   jeevan_23    7 年前

    您错误地实现了mergesort函数。应该是这样的

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