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

首頁(yè) > 編程 > Java > 正文

歸并排序的實(shí)現(xiàn)代碼與思路

2019-11-26 16:13:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首先考慮下如何將將二個(gè)有序數(shù)列合并。這個(gè)非常簡(jiǎn)單,只要從比較二個(gè)數(shù)列的第一個(gè)數(shù),誰(shuí)小就先取誰(shuí),取了后就在對(duì)應(yīng)數(shù)列中刪除這個(gè)數(shù)。然后再進(jìn)行比較,如果有數(shù)列為空,那直接將另一個(gè)數(shù)列的數(shù)據(jù)依次取出即可。

復(fù)制代碼 代碼如下:

View Code
 //將有序數(shù)組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++];
 }

可以看出合并有序數(shù)列的效率是比較高的,可以達(dá)到O(n)。

解決了上面的合并有序數(shù)列問(wèn)題,再來(lái)看歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進(jìn)行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了?

可以將A,B組各自再分成二組。依次類推,當(dāng)分出來(lái)的小組只有一個(gè)數(shù)據(jù)時(shí),可以認(rèn)為這個(gè)小組組內(nèi)已經(jīng)達(dá)到了有序,然后再合并相鄰的二個(gè)小組就可以了。這樣通過(guò)先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。

復(fù)制代碼 代碼如下:

View Code
 //將有二個(gè)有序數(shù)列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); //再將二個(gè)有序數(shù)列合并
     }
 }

 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;
 }

歸并排序的效率是比較高的,設(shè)數(shù)列長(zhǎng)為N,將數(shù)列分開(kāi)成小數(shù)列一共要logN步,每步都是一個(gè)合并有序數(shù)列的過(guò)程,時(shí)間復(fù)雜度可以記為O(N),故一共為O(N*logN)。因?yàn)闅w并排序每次都是在相鄰的數(shù)據(jù)中進(jìn)行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 左权县| 延吉市| 北辰区| 大余县| 汕头市| 无为县| 北安市| 宣武区| 锦州市| 镇康县| 铁力市| 南部县| 宁乡县| 自贡市| 临西县| 馆陶县| 玛纳斯县| 宝鸡市| 兴海县| 滨州市| 江陵县| 牡丹江市| 靖江市| 涿州市| 双峰县| 新建县| 洛阳市| 临高县| 桐柏县| 威宁| 郑州市| 托克逊县| 平昌县| 莫力| 红河县| 张掖市| 仲巴县| 邵阳市| 天津市| 阜平县| 介休市|