歸併排序(MERGE-SORT)是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。算法
1 public class MergeSort { 2 public static void main(String[] args) { 3 int[] arr = {100, 30, 70, 20, 80, 60, 40, 50, 90, 10}; 4 mergeSort(arr, 0, arr.length - 1); 5 System.out.println("排序結果:" + Arrays.toString(arr)); 6 } 7 8 private static void merge(int[] arr, int low, int middle, int high) { 9 // 建立一個新的新的數組,與傳入數組大小一致 10 int[] temp = new int[high - low + 1]; 11 // 定義左指針,從最低位開始 12 int i = low; 13 // 定義右指針,從中間位向右偏移一位 14 int j = middle + 1; 15 int k = 0; 16 // 左右指針同時移動,把較小的數先移到新數組中 17 while (i <= middle && j <= high) { 18 if (arr[i] < arr[j]) { 19 temp[k++] = arr[i++]; 20 } else { 21 temp[k++] = arr[j++]; 22 } 23 } 24 // 把左邊剩餘的數移入新數組 25 while (i <= middle) { 26 temp[k++] = arr[i++]; 27 } 28 // 把右邊邊剩餘的數移入新數組 29 while (j <= high) { 30 temp[k++] = arr[j++]; 31 } 32 // 新數組覆蓋原數組 33 for (int k2 = 0; k2 < temp.length; k2++) { 34 arr[k2 + low] = temp[k2]; 35 } 36 } 37 38 private static void mergeSort(int[] arr, int low, int high) { 39 // 定義源數組中間位置的索引 40 int middle = (low + high) / 2; 41 if (low < high) { 42 // 左邊 43 mergeSort(arr, low, middle); 44 // 右邊 45 mergeSort(arr, middle + 1, high); 46 // 左右歸併 47 merge(arr, low, middle, high); 48 System.out.println(Arrays.toString(arr)); 49 } 50 } 51 }