Java版歸并排序算法實(shí)現(xiàn)

    1. merge函數(shù)的實(shí)現(xiàn)
private static void merge(int[] arr, int low, int mid, int high) {
    // 將要排序的數(shù)組片段復(fù)制出來
    int[] temp = Arrays.copyOfRange(arr, low, high + 1);
    // 左邊數(shù)組的結(jié)束索引
    int end1 = mid - low;
    // 右邊數(shù)組的結(jié)束索引
    int end2 = temp.length - 1;
    // 左邊數(shù)組開始?xì)w并的索引
    int i = 0;
    // 右邊數(shù)組開始?xì)w并的索引
    int j = end1 + 1;

    for (int k = low; k <= high; k++) {
        if (i > end1) {
            // 左邊數(shù)組的歸并指針率先超出了左邊數(shù)組的范圍
            // 則直接將右邊剩下的所有數(shù)據(jù)全部復(fù)制過去即可
            arr[k] = temp[j];
            j++;
        } else if (j > end2) {
            // 右邊數(shù)組的歸并指針率先超出了右邊數(shù)組的范圍
            // 則直接將左邊剩下的所有數(shù)據(jù)全部復(fù)制過去即可
            arr[k] = temp[i];
            i++;
        } else {
            // 正常歸并
            if (temp[i] < temp[j]) {
                arr[k] = temp[i];
                i++;
            } else {
                arr[k] = temp[j];
                j++;
            }
        }
    }
}
    1. 遞歸方式實(shí)現(xiàn)(自頂向下)的歸并排序算法
public static void mergeSort(int[] arr, int low, int high) {
    if (low >= high) {
        return;
    }
    int mid = low + (high - low) / 2;
    mergeSort(arr, low, mid);
    mergeSort(arr, mid + 1, high);
    merge(arr, low, mid, high);
}

    1. 借用棧實(shí)現(xiàn)循環(huán)方式(自頂向下)的歸并排序算法
public static void mergeSort2(int[] arr) {
    if (arr.length <= 1) {
        return;
    }
    Stack<Integer> st = new Stack<>();
    int left = 0;
    int right = arr.length - 1;
    int center = left + (right - left) / 2;
    st.push(left);
    st.push(right);
    while (!st.isEmpty()) {
        int high = st.pop();
        int low = st.pop();
        int mid = low + (high - low) / 2;
        if (low < mid) {
            st.push(low);
            st.push(mid);
        }
        if (mid + 1 < high) {
            st.push(mid + 1);
            st.push(high);
        }
        merge(arr, low, mid, high);
    }
    merge(arr, left, center, right);
}
    1. 不借用棧(自低向上)直接循環(huán)方式實(shí)現(xiàn)的歸并排序算法
      這種方式可以實(shí)現(xiàn)對(duì)鏈表進(jìn)行 Nlog(N)時(shí)間復(fù)雜度級(jí)別的排序
public static void mergeSort3(int[] arr) {
    for (int sz = 1; sz <= arr.length; sz += sz) {
        for (int i = 0; i + sz < arr.length; i += sz + sz) {
            int low = i;
            int mid = i + sz - 1;
            int high = Math.min(i + sz + sz - 1, arr.length - 1);
            merge(arr, low, mid, high);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1、基本思想 分析歸并排序之前,我們先來了解一下分治算法。 分治算法的基本思想是將一個(gè)規(guī)模為N的問題分解為K個(gè)規(guī)模...
    冰河winner閱讀 1,044評(píng)論 2 5
  • 思路 歸并排序的思想是先將數(shù)組分散為小數(shù)組分別排序,然后將結(jié)果歸并起來。 原地歸并的抽象方法 將兩個(gè)已經(jīng)排序好的數(shù)...
    不可思議的Mark閱讀 4,171評(píng)論 12 31
  • 序言 上一篇文章我們已經(jīng)講完了插入排序,也就是說我的On^2 的算法基本就寫完了,當(dāng)然還有別的On^2 的算法,但...
    再見遠(yuǎn)洋閱讀 1,782評(píng)論 0 3
  • 自頂向下歸并排序運(yùn)用的原理:分治法和遞歸 特點(diǎn):犧牲空間效率來提升時(shí)間效率 分治法的精髓: 分--將問題分解為規(guī)...
    Change_6556閱讀 552評(píng)論 0 0
  • 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and ...
    Hacker_Jp閱讀 2,090評(píng)論 0 0

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