歸并排序-Java實現(xiàn)

在極客時間學(xué)習(xí)時,又遇到了歸并排序,這里給出Java的實現(xiàn),附有注解,以備后面學(xué)習(xí)查看

private int[] sortArray(int[] waitDealArray) {
    if(waitDealArray == null) {
        return new int[0];
    }
    if(waitDealArray.length == 1) {
        return waitDealArray;
    }
    int middleIdx = waitDealArray.length / 2;
    // 將數(shù)組從中間分成左右兩個,分而治之
    int[] leftArray = Arrays.copyOfRange(waitDealArray, 0, middleIdx);
    int[] rightArray = Arrays.copyOfRange(waitDealArray, middleIdx, waitDealArray.length);
    // 遞歸調(diào)用處理子問題
    leftArray = sortArray(leftArray);
    rightArray = sortArray(rightArray);
    // 合并子問題處理的結(jié)果
    int[] mergedArray = mergeArray(leftArray, rightArray);
    return mergedArray;
}

private int[] mergeArray(int[] leftArray, int[] rightArray) {
    if(leftArray == null) {
        leftArray = new int[0];
    }
    if(rightArray == null) {
        rightArray = new int[0];
    }
    int[] mergedArray = new int[leftArray.length + rightArray.length];
    int mi = 0, li = 0, ri = 0;
    // 用來合并兩個有序數(shù)組內(nèi)的數(shù)字
    while(li < leftArray.length && ri < rightArray.length) {
        if(leftArray[li] <= rightArray[ri]) {
            mergedArray[mi] = leftArray[li];
            li++;
        } else {
            mergedArray[mi] = rightArray[ri];
            ri++;
        }
        mi++;
    }
    // 如果某個數(shù)組還有剩余數(shù)字,直接放入合并數(shù)組即可
    if(li < leftArray.length) {
        for(int i = li; i < leftArray.length; i++) {
            mergedArray[mi] = leftArray[li];
            mi++;
        }
    }
    if(ri < rightArray.length) {
        for(int i = ri; i < rightArray.length; i++) {
            mergedArray[mi] = rightArray[i];
            mi++;
        }
    }
    return mergedArray;
}

寫一個測試用例測試下:

/**
 * 測試歸并排序操作
 */
@Test
public void testUnionSort() {
    int[] waitDealArray = {234, 12, 45, 2, 908, 111, 309, 103, 205, 9};
    int[] sortedArray = sortArray(waitDealArray);
    System.out.println(Arrays.toString(sortedArray));
}

打印結(jié)果:

[2, 9, 12, 45, 103, 111, 205, 234, 309, 908]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一. 寫在前面 要學(xué)習(xí)算法,“排序”是一個回避不了的重要話題,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后,今天我們終于可...
    Leesper閱讀 2,653評論 0 40
  • 2018.03.20今日分享:今晚崇遠(yuǎn)做了語文、數(shù)學(xué)、英語、游泳訓(xùn)練、美術(shù)、學(xué)能訓(xùn)練等課程,我說崇遠(yuǎn)一晚上做了這么...
    幸福樹328閱讀 203評論 0 0
  • 所有男人都敢作敢當(dāng) 所有女人都溫柔如霜 冰河里魚兒盡情游蕩 九天外鳥兒自由翱翔 酒館里永遠(yuǎn)熙熙攘攘 馬路邊青年放聲...
    小小仲馬閱讀 237評論 2 1
  • react簡介 react是由Fecebook開發(fā)的UI庫,它的核心思想開發(fā)reactJS的組件可以重復(fù)調(diào)用,易于...
    小_b6d4閱讀 556評論 0 0

友情鏈接更多精彩內(nèi)容