我的Merge排序java代码出了什么问题?

时间:2018-03-06 14:12:02

标签: java mergesort

这是我的java代码。

public static int[] merge_sort(int[] arr, int p, int r) {
    if (p < r) {
        int q = p + r / 2;

        merge_sort(arr, p, q);
        merge_sort(arr, q + 1, r);
        merge(arr, p, q, r);
    }

    return arr;
}

public static void merge(int[] arr, int p, int q, int r) {
    int i = p;
    int j = q + 1;

    int[] tempArr = new int[arr.length];
    System.out.println(tempArr.length);

    int k = p;

    while (i <= q && j <= r) {
        if (arr[i] <= arr[j]) {
            tempArr[k] = arr[i];
            i++;
        } else {
            tempArr[k] = arr[j];
            j++;
        }

        k++;
    }

    while (i <= q) {
        tempArr[k] = arr[i];
        i++;
        k++;
    } 

    while (j <= r) {
        tempArr[k] = arr[j];
        j++;
        k++;
    }

    for (int h = p; h <= r; h++) {
        arr[h] = tempArr[h];
    }
}

我的测试代码在这里。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int[] testArr = {3, 5, 1, 9, 2};
    int[] sortedArr = merge_sort(testArr, 0, testArr.length - 1);

    for (int num: sortedArr) {
        System.out.print(num);
    }
}

当我使用我的测试代码进行测试时,调用了“java.lang.StackOverflowError”错误。 'merge_sort(arr,p,q);'中发生错误线。 我不知道为什么会出现这个错误。我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

您的代码中有无尽的递归调用:

 merge_sort(arr, p, q); // this one calls the same method over and over again
 merge_sort(arr, q + 1, r);
 merge(arr, p, q, r);

第一个调用缺少第四个参数

答案 1 :(得分:0)

问题出在这一行:int q = p + r / 2;

这应该是int q = (p + r) / 2;