0

我在课堂上复制了一个mergeSort代码,你能帮我找出错误吗?

当我运行使用程序的主程序时,mergeSort程序进入无限循环但不显示任何错误。我尝试在调试模式下运行,但我不是很专家,我没有发现问题所在。但是我认为错误是mergeSort(int[] v, int inf, int sup)递归的。

public class CopyOfSortMethods {

private static void merge(int[] v, int inf, int med, int sup) {
    int aux[] = new int[v.length];
    int i = inf;
    int j = med + 1;
    int k = inf;

    while ((i <= med) && (j <= sup)) {
        if (v[i] < v[j]) {
            aux[k] = v[i];
            i++;
            k++;
        } else {
            aux[k] = v[j];
            j++;
            k++;
        }
    }
    while (i <= med) {
        aux[k] = v[i];
        i++;
        k++;
    }
    while (j <= sup) {
        aux[k] = v[j];
        j++;
        k++;
    }
    for (i = 0; i <= sup; i++) {
        v[i] = aux[i];
    }
}

public static void mergeSort(int[] v, int inf, int sup) {
    int med;

    while (inf < sup){
        med = (inf + sup)/2;
        mergeSort(v, inf, med);
        mergeSort(v, med + 1, sup);
        merge(v, inf, med, sup);
    }
}

public static void mergeSort(int[] v) {
    if(v!=null) {
        mergeSort(v, 0, v.length - 1);
    }

}
}
4

2 回答 2

1

正如 Maverik 指出的那样,问题while在于mergeSort().

inf并且sup永远不会被修改,所以inf总是小于sup. 循环永远不会终止。

于 2013-05-13T16:55:08.970 回答
0

合并排序中的问题(基于评论):

  1. mergeSort方法中,您递归地调用循环mergeSort内部while并且永远不会更改 and 的infsup。改为if改为。

     if (inf < sup) {
         //code goes here...
     }
    
  2. 在您的merge排序中,在方法主体的底部,您将所有项目从aux数组移动到v数组。inf您应该只在和之间移动元素sup

    //for (i = 0; i <= sup; i++) {
    for (i = inf; i <= sup; i++) {
        //code goes here...
    }
    
于 2013-05-13T19:04:00.907 回答