數據結構--遞歸實現歸併排序

 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 }
相關文章
相關標籤/搜索