国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

數據結構之歸并排序的實例詳解

2020-01-26 13:56:18
字體:
來源:轉載
供稿:網友

歸并排序

基本思想                                                                                                

歸并排序是建立在二路歸并和分治法的基礎上的一個高效排序算法,將已有序的子序列合并,得到完全有序的序列;即先使每個子序

列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

將待排序序列R[0...n-1]看成是n個長度為1的有序序列,將相鄰的有序表成對歸并,得到n/2個長度為2的有序表;將這些有序序列

再次歸并,得到n/4個長度為4的有序序列;如此反復進行下去,最后得到一個長度為n的有序序列。所以呢,我們總結一下歸并排序

其實就只有兩步:

分解:將有序序列不斷地分裂,直到每個區間都只有一個數據為止.

合并:將兩個區間合并為一個有序的區間,一直合并知道只有一個區間為止.

圖是我偷來的,但是學習是認真的.

分解的過程我們很容易想明白的,用遞歸就可以.但是我們今天最主要的步驟是合并,你要將兩個區間合并為一個有序的區間你會怎么思考呢?

這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了后就在對應數列中刪除這個數。然后再進行比較,如果有數

列為空,那直接將另一個數列的數據依次取出即可。

代碼實現:

//將有序數組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++];  }  

其實我們發現這種做法效率其實還是蠻高的,效率達到了O(N).現在我們解決了合并的問題.

現在總的來看一下歸并排序的做法,通過先遞歸的分解數列(將數列分解成只有一個元素的區間),再合并數列就完成了歸并排序。

代碼實現                                                                                                 

//將有二個有序數列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  {    int i = first, j = mid + 1;    int m = mid,  n = last;    int k = 0;        while (i <= m && j <= n)    {      if (a[i] <= a[j])        temp[k++] = a[i++];      else        temp[k++] = a[j++];    }        while (i <= m)      temp[k++] = a[i++];        while (j <= n)      temp[k++] = a[j++];        for (i = 0; i < k; i++)      a[first + i] = temp[i];  }  void mergesort(int a[], int first, int last, int temp[])  {    if (first < last)    {      int mid = (first + last) / 2;      mergesort(a, first, mid, temp);  //左邊有序      mergesort(a, mid + 1, last, temp); //右邊有序      mergearray(a, first, mid, last, temp); //再將二個有序數列合并    }  }    bool MergeSort(int a[], int n)  {    int *p = new int[n];    if (p == NULL)      return false;    mergesort(a, 0, n - 1, p);    delete[] p;    return true;  }  

總結                                                                                                  

歸并排序的效率是比較高的,設數列長為N,將數列分開成小數列一共要logN步,每步都是一個合并有序數列的過程,時間復雜度

可以記為O(N),故一共為O(N*logN)。因為歸并排序每次都是在相鄰的數據中進行操作,所以歸并排序在O(N*logN)的幾種排序方

法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。

算法名稱  最差時間復雜度  平均時間復雜度  最優時間復雜度  空間復雜度  穩定性

歸并排序    O(NlogN)    O(NlogN)              O(NlogN)       O(n)        穩定

所有排序當中用的最多的就是堆排序,快速排序,歸并排序.

若從空間復雜度來考慮:首選堆排序,其次是快速排序,最后是歸并排序。

若從穩定性來考慮,應選取歸并排序,因為堆排序和快速排序都是不穩定的。

若從平均情況下的排序速度考慮,應該選擇快速排序。

以上就是數據結構中歸并排序的實例詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 尉氏县| 英山县| 临泽县| 沙雅县| 土默特左旗| 岳西县| 报价| 乌恰县| 彭泽县| 定陶县| 宁明县| 礼泉县| 扬中市| 沂水县| 曲阜市| 荥阳市| 云林县| 云南省| 民县| 河东区| 丹棱县| 通州市| 札达县| 绥中县| 东兴市| 突泉县| 定安县| 海淀区| 潢川县| 榆社县| 绍兴市| 北碚区| 钟祥市| 桂林市| 札达县| 上林县| 金山区| 黄浦区| 田阳县| 深泽县| 大邑县|