歸併排序(C語言實現)

來源:互聯網
上載者:User

標籤:失敗   合并   mda   rect   malloc   typedef   es2017   申請   nlogn   

        合并排序(MERGE SORT)是又一類不同的排序方法,合并的含義就是將兩個或兩個以上的有序資料序列合并成一個新的有序資料序列,因此它又叫歸併演算法。

        它的基本思想就是假設數組A有N個元素,那麼可以看成數組A是又N個有序的子序列組成,每個子序列的長度為1,然後再兩兩合并,得到了一個 N/2 個長度為2或1的有序子序列,再兩兩合并,如此重複,值得得到一個長度為N的有序資料序列為止,這種排序方法稱為2—路合并排序。
  例如數組A有7個資料,分別是: 49 38 65 97 76 13 27,那麼採用歸併排序演算法的操作過程: 
  初始值 [49] [38] [65] [97] [76] [13] [27] 
  看成由長度為1的7個子序列組成 
  第一次合并之後 [38 49] [65 97] [13 76] [27] 
  看成由長度為1或2的4個子序列組成 
  第二次合并之後 [38 49 65 97] [13 27 76] 
  看成由長度為4或3的2個子序列組成 
  第三次合并之後 [13 27 38 49 65 76 97] 
  合并演算法的核心操作就是將一維數組中前後相鄰的兩個兩個有序序列合并成一個有序序列。合并演算法也可以採用遞迴演算法來實現,形式上較為簡單,但實用性很差。合并演算法的合并次數是一個非常重要的量,根據計算當數組中有3到4個元素時,合并次數是2次,當有5到8個元素時,合并次數是3次,當有9到16個元素時,合并次數是4次,按照這一規律,當有N個子序列時可以推斷出合并的次數是X(2 >=N,符合此條件的最小那個X)。
  其時間複雜度為:O(nlogn).所需輔助儲存空間為:O(n)
  歸併演算法如下:

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>   typedef int RecType;//要排序元素類型  void Merge(RecType *R, int low, int m, int high){    //將兩個有序的子檔案R[low..m)和R[m+1..high]歸併成一個有序的子檔案R[low..high]      int i = low, j = m + 1, p = 0;                //置初始值      RecType *R1;                        //R1是局部向量      R1 = (RecType *)malloc((high - low + 1)*sizeof(RecType));    if (!R1)    {        return;                         //申請空間失敗      }    while (i <= m&&j <= high)                //兩子檔案非空時取其小者輸出到R1[p]上      {        R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];    }    while (i <= m)                         //若第1個子檔案非空,則複製剩餘記錄到R1中      {        R1[p++] = R[i++];    }    while (j <= high)                      //若第2個子檔案非空,則複製剩餘記錄到R1中      {        R1[p++] = R[j++];    }    for (p = 0, i = low; i <= high; p++, i++)    {        R[i] = R1[p];                     //歸併完成後將結果複製回R[low..high]      }}void MergeSort(RecType R[], int low, int high){    //用分治法對R[low..high]進行二路歸併排序      int mid;    if (low<high)    {   //區間長度大於1           mid = (low + high) / 2;               //分解          MergeSort(R, low, mid);           //遞迴地對R[low..mid]排序          MergeSort(R, mid + 1, high);        //遞迴地對R[mid+1..high]排序          Merge(R, low, mid, high);          //組合,將兩個有序區歸併為一個有序區      }}void main(){    int a[7] = { 49, 38, 65, 97, 76, 13, 27 }; //這裡對7個元素進行排序      int low = 0, high = 6;                   //初始化low和high的值      printf("Before merge sort: \n");    for (int i = low; i <= high; i++)    {        printf("%d ", a[i]);             //輸出測試      }    printf("\n");    MergeSort(a, low, high);    printf("\n After merge sort: \n");    for (int i = low; i <= high; i++)    {        printf("%d ", a[i]);             //輸出測試      }    printf("\n");}

實現歸併排序;歸併排序演算法分為兩步,第一步:先將原來的資料表分成排好序的子表,然後調用 Merger  對子表進行歸併,使之成為有序表,例如有如下向量:

  25,10,7,19,3,48,12,17,56,30,21

對此序列進行歸併排序的步驟為:

 

歸併排序(C語言實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.