排序演算法(七)——歸併排序
阿新 • • 發佈:2019-01-14
歸併排序(Merge Sort)演算法就是將多個有序資料表合併成一個有序資料表。如果參與合併的只有兩個有序表,則稱為二路合併。對於一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合併排序。
合併排序演算法的運作如下:
(1)首先將含有n個結點的待排序資料序列看成9個長度為1的有序子表。
(2)將這些有序子表依次兩兩合併,得到長度為2的若干有序子表。
(3)然後再對這些子表進行兩兩合併,得到長度為4的若干有序子表....
(3)不斷重複上述過程,直到子表長度為n,合併成為一整個序列,也就完成了整個排序過程。
package cn.kimtian.sort; import java.util.Arrays; /** * 歸併排序 * * @author kimtian */ public class MergeSort { public static void main(String[] args) { int[] arr = {1, 3, 6, 7, 8, 0, 7, 4, 2, 1}; mergeSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } public static void mergeSort(int[] arr, int low, int hight) { int middle = (hight + low) / 2; //遞迴的結束條件 if (low < hight) { //處理左邊 mergeSort(arr, low, middle); //處理右邊 mergeSort(arr, middle + 1, hight); //歸併 merge(arr, low, middle, hight); } } /** * 合併 */ public static void merge(int[] arr, int low, int middle, int high) { //用於儲存歸併後的臨時陣列 int[] temp = new int[high - low + 1]; //記錄第一個陣列中需要遍歷的下標 int i = low; //記錄第二個陣列中需要遍歷的下標 int j = middle + 1; //用於記錄在臨時陣列中存放的下標 int index = 0; //遍歷兩個陣列,取出小的數字放入臨時檔案中 while (i <= middle && j <= high) { //如果第一個陣列的最小值,小於等於第二個陣列的最小值,則把i放入臨時陣列中 if (arr[i] <= arr[j]) { temp[index] = arr[i]; i++; } //第二個陣列的資料更小,把第二個陣列的資料j放入臨時陣列中 else { temp[index] = arr[j]; j++; } index++; } //處理多餘的資料 while (j <= high) { temp[index] = arr[j]; j++; index++; } while (i <= middle) { temp[index] = arr[i]; i++; index++; } //把臨時陣列中的資料重新存入原陣列 for (int k = 0; k < temp.length; k++) { arr[k + low] = temp[k]; } } }