合并排序 - 使用Int数组排序字符串数组

时间:2014-02-26 20:24:02

标签: java mergesort

对于这个项目,我给出了一个字符串数组和一个int数组。 int [1]是字符串[1]的排名。我需要使用mergesort按顺序从1到n对int数组进行排序,我在下面做了。但是当int数组被移动时我还需要切换字符串数组的位置,这样它们都被排序,如果这有意义的话?我无法弄清楚我的编码有什么问题,或者即使我的想法确实有效,但我仍然在stringSorted [k] = stringRight [j]上得到一个数组索引超出界限错误,我无法弄清楚是否有解决这个问题的方法。本质上,当一个int被添加到sortedInt数组时,我还将该元素添加到已排序的String数组中。感谢您的帮助,如果有什么不合理的话,请告诉我

private static int sortAndCount(int intToSort[]){

    int inversionsLeft;
    int inversionsRight;
    int inversionsMerged;

    if(intToSort.length == 1){
        return 0;
    }

    int m = intToSort.length/2;

    int[] intLeft = new int[m];
    stringLeft = new String[m];

    int[] intRight = new int[intToSort.length-m];
    stringRight = new String[intToSort.length-m];


    for (int i=0; i < m; i++){
        intLeft[i] = intToSort[i];
        stringLeft[i] = stringToSort[i];
    }

    for (int i = 0;i < intRight.length; i++){
            intRight[i] = intToSort[m+i];
            stringRight[i] = stringToSort[m+i];
    }

    inversionsLeft = sortAndCount(intLeft);
    inversionsRight = sortAndCount(intRight);

    intSorted = new int[intToSort.length];
    stringSorted = new String[stringToSort.length];

    inversionsMerged = mergeAndCount(intLeft, intRight);

    return(inversionsLeft + inversionsRight + inversionsMerged);

}

private static int mergeAndCount(int[] intLeft, int[] intRight){

    int count = 0;
    int i = 0;
    int j = 0;
    int k = 0;

    while(i < intLeft.length && j < intRight.length){

        if(intLeft[i] < intRight[j]){
            intSorted[k] = intLeft[i];
            stringSorted[k] = stringLeft[i];
            i++;
        }

        else{
            intSorted[k] = intRight[j];
            stringSorted[k] = stringRight[j];
            count += intLeft.length - i + 1;
            j++;
        }

        k++;

    }

     while (i < intLeft.length)
        {
            intSorted[k] = intLeft[i];
            stringSorted[k] = stringLeft[i];
            k++;
            i++;

        }

     while (j < intRight.length)
        {
            intSorted[k] = intRight[j];
            stringSorted[k] = stringRight[j];
            j++;
            k++;

        }

     return count;

}

}

1 个答案:

答案 0 :(得分:0)

int[] intLeft = new int[m];
stringLeft = new String[m];

int[] intRight = new int[intToSort.length-m];
stringRight = new String[intToSort.length-m];

你会注意到,对于int数组,你要创建新变量,对于要替换外部的字符串。这会使每个递归调用使string数组变小,而将int数组传递给每个方法。

当您致电mergeAndCount时,stringLeftstringRight非常小,而适当大小的intLeftintRight会作为参数传递。