1 /*通過遞歸實作歸并排序
2 * 具有思路:将要排序的數組不斷劃分,直到隻有一個元素的時候停止;
3 * 這是遞歸的基準條件,傳回進行排序。
4 * 歸并排序的時間複雜度:O(NlogN):考慮的是複制資料到workarr和workarr到arr的次數
5 *
6 * */
7 public class MergeWithRecursion {
8 static int items = 6;
9 static int[] arr = {10,8,9,59,2,4};
10 public static void main(String[] args) {
11 display();
12 mergeSort();
13 display();
14
15 }
16
17 public static void mergeSort(){
18 int[] workarr = new int[items];
19 recMergeSort(workarr,0,items-1);
20 }
21
22 private static void recMergeSort(int[] workarr, int low, int high) {
23 if(low == high){
24 return;
25 }
26 else{
27 int mid = (low + high) / 2;
28 recMergeSort(workarr,low,mid);
29 recMergeSort(workarr,mid+1,high);
30 merge(workarr,low,mid+1,high);
31 }
32
33 }
34
35 private static void merge(int[] workarr, int low, int mid, int high) {
36 //workarr index
37 int j = 0;
38 int lowbound = low;
39 int midindex = mid - 1;
40 int n = high - lowbound + 1;
41 //進行歸并到工作區數組
42 while(low <= midindex && mid <= high){
43 if(arr[low] < arr[mid]){
44 workarr[j++] = arr[low++];
45 }
46 else{
47 workarr[j++] = arr[mid++];
48 }
49 }
50
51 while(low <= midindex){
52 workarr[j++] = arr[low++];
53 }
54
55 while(mid <= high){
56 workarr[j++] = arr[mid++];
57 }
58
59 //将工作區部分有序的數組複制到原來的數組
60 for(int i = 0; i < n;i++){
61 arr[lowbound + i] = workarr[i];
62 }
63 }
64
65 public static void display(){
66 for(int i = 0; i < arr.length;i++){
67 System.out.print(arr[i] + " ");
68 }
69 System.out.println();
70 }
71
72 }