歸併排序

名詞解釋:——來自百度百科

  歸併排序(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 }
相關文章
相關標籤/搜索