1. 程式人生 > 實用技巧 >八大基本排序演算法-----歸併排序

八大基本排序演算法-----歸併排序

歸併排序(Merge Sort)


    • 基本思想:參考
      歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的一個非常典型的應用。
      首先考慮下如何將2個有序數列合併。這個非常簡單,只要從比較2個數列的第一個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另一個數列的資料依次取出即可。

    • //將有序陣列a[]和b[]合併到c[]中
      void MemeryArray(int a[], int n, int b[], int m, int c[])
      {
       int i, j, k;
      
       i = j = k = 0;
       while (i < n && j < m)
       {
           
      if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; }

      解決了上面的合併有序數列問題,再來看歸併排序,其的基本思路就是將陣列分成2組A,B,如果這2組組內的資料都是有序的,那麼就可以很方便的將這2組資料進行排序。如何讓這2組組內資料有序了?
      可以將A,B組各自再分成2組。依次類推,當分出來的小組只有1個數據時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的2個小組就可以了。這樣通過先遞迴的分解數列

      再合併數列就完成了歸併排序。

    • 平均時間複雜度:O(NlogN)
      歸併排序的效率是比較高的,設數列長為N,將數列分開成小數列一共要logN步,每步都是一個合併有序數列的過程,時間複雜度可以記為O(N),故一共為O(N*logN)。

    • public static void merge_sort(int a[],int first,int last,int temp[]){
      
        if(first < last){
            int middle = (first + last)/2;
            merge_sort(a,first,middle,temp);//左半部分排好序
            merge_sort(a,middle+1,last,temp);//
      右半部分排好序 mergeArray(a,first,middle,last,temp); //合併左右部分 } } //合併 :將兩個序列a[first-middle],a[middle+1-end]合併 public static void mergeArray(int a[],int first,int middle,int end,int temp[]){ int i = first; int m = middle; int j = middle+1; int n = end; int k = 0; while(i<=m && j<=n){ if(a[i] <= a[j]){ temp[k] = a[i]; k++; i++; }else{ temp[k] = a[j]; k++; j++; } } while(i<=m){ temp[k] = a[i]; k++; i++; } while(j<=n){ temp[k] = a[j]; k++; j++; } for(int ii=0;ii<k;ii++){ a[first + ii] = temp[ii]; } }