1. 程式人生 > >歸並排序(C語言實現)

歸並排序(C語言實現)

ngs 基本 merge 兩個 它的 efi 分別是 void rec

合並排序(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語言實現)