(戀上資料結構筆記):歸併排序(Merge Sort)
目錄
歸併排序
- 1945年由約翰·馮·諾伊曼(John von Neumann)首次提出。
- 執行流程
- ① 不斷地將當前序列平均分割成 2 個子序列
- 直到不能再分割(序列中只剩 1 個元素)
- ② 不斷地將 2 個子序列合併成一個有序序列
- 直到最終只剩下 1 個有序序列
序列分割-divide
protected void sort() { leftArray = (T[]) new Comparable[array.length >> 1]; sort(0, array.length); } / * 對 [begin, end) 範圍的資料進行歸併排序 */ private void sort(int begin, int end){ if(end - begin < 2) return; // 至少要2個元素 int mid = (begin + end) >> 1; sort(begin, mid); // 歸併排序左半子序列 sort(mid, end); // 歸併排序右半子序列 merge(begin, mid, end); // 合併整個序列 }
序列合併-merge
原地合併-merge
- 將兩個序列合併時,不一定要合併到新空間,可以合理的利用原空間實現原地合併。
- 例如:
- 將 array的左半部分[begin, mid),備份到 leftArray 中;
- 然後將 leftArray 視為左子序列,arrary的右半部分[mid, end] 視為右子序列;
- 將左子序列和右子序列合併到 array 中。
- 合併過程
左邊先結束
右邊先結束
程式碼實現
public class MergeSort <T extends Comparable<T>> extends Sort<T> { private T[] leftArray; @Override protected void sort() { // 準備一段臨時的陣列空間, 在merge操作中使用 leftArray = (T[])new Comparable[array.length >> 1]; sort(0, array.length); } /** * 對 [begin, end) 範圍的資料進行歸併排序 */ private void sort(int begin, int end){ if(end - begin < 2) return; // 至少要2個元素 int mid = (begin + end) >> 1; sort(begin, mid); // 歸併排序左半子序列 sort(mid, end); // 歸併排序右半子序列 merge(begin, mid, end); // 合併整個序列 } /** * 將 [begin, mid) 和 [mid, end) 範圍的序列合併成一個有序序列 */ private void merge(int begin, int mid, int end){ int li = 0, le = mid - begin; // 左邊陣列(基於leftArray) int ri = mid, re = end; // 右邊陣列(array) int ai = begin; // array的索引 // 備份左邊陣列到leftArray for(int i = li; i < le; i++){ leftArray[i] = array[begin + i]; } // 如果左邊還沒有結束 while(li < le){ // li == le 左邊結束, 則直接結束歸併 if(ri < re && cmp(array[ri], leftArray[li]) < 0){ // cmp改為<=0會失去穩定性 array[ai++] = array[ri++]; // 右邊<左邊, 拷貝右邊陣列到array }else{ array[ai++] = leftArray[li++]; // 左邊<=右邊, 拷貝左邊陣列到array } } } }
- 測試
複雜度分析
【常見的遞推式和複雜度】
相關文章
- Bootstrap Blazor 元件介紹 Table (三)列資料格式功能介紹
- Layui 表格資料修改成功後重新整理顯示
- 06 | 關係資料理論
- mediasoup 學習筆記 【三】 Producer 資料生產者
- 2013第四屆藍橋杯省賽C++B組【第六題:三部排序】
- 編號函式 自定義函式 集合型別 表的優化 資料傾斜
- ARP原理概述——基於WinPcap傳送ARP請求資料包獲取遠端MAC地址
- 【Linux學習筆記24-1】網路檔案系統 samba共享設定 + 自動掛解除安裝 autofs
- 極光大資料:2020年Q3移動網際網路行業資料研究報告(附下載)
- 序列化資料傳輸壓縮
- 草稿 核取方塊繫結資料 1204
- python——numpy學習筆記
- Java語言程式設計與資料結構(基礎篇)課後複習題 第八章(四)
- 二進位制函式JSON資料分類問題——機器學習
- 如何將EXCEL資料表裡面的資料逆時針旋轉90度
- 資料庫關鍵詞 drop、truncate和delete的用法
- 資料庫之建立索引
- 今日資料行業日報(2020.12.04)『2020年第三季度中國可穿戴裝置市場出貨量為3,293萬臺 同比增長15.3%』
- Spark儲存Parquet資料到Hive,對map、array、struct欄位型別的處理
- K 均值演算法-如何讓資料自動分組