青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天之道

享受編程的樂趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

歸并排序算法及其實現代碼詳解

Posted on 2012-11-25 21:23 hoshelly 閱讀(3782) 評論(0)  編輯 收藏 引用 所屬分類: DS && Algorithm

歸并排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。
例如,有數列{6,202,100,301,38,8,1}
1.  剛開始的分組如下:
  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 比較次數為3次
 2. 第二次,兩兩分組合并
  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 比較次數為4
3.  第三次,繼續合并
  i=3 [ 1 6 8 38 100 202 301 ] 比較次數為4
總計的比較次數為11次
歸并排序具體工作原理如下(假設序列共有n個元素):
1.     將序列每相鄰兩個數字進行歸并操作,形成floor(n / 2)個序列,排序后每個序列包含兩個元素
2.     將上述序列再次歸并,形成floor(n / 4)個序列,每個序列包含四個元素
3.     重復步驟2,直到所有元素排序完畢
     歸并操作的過程如下:
1.     申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
2.     設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3.     比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
4.     重復步驟3直到某一指針達到序列尾
5.     將另一序列剩下的所有元素直接復制到合并序列尾

自底向上歸并,如圖所示:



遞歸實現代碼:

#include <iostream>
 
 using namespace std;
 
 void merge(int*arr, int p, int q, int r)
 {
     int n1 = q - p + 1;
     int n2 = r - q;
 
     int* L = new int[n1];
     int* R = new int[n2];
 
     for(int i = 0; i < n1; i++)
     {
         L[i] = arr[p + i];
     }
     for(int j = 0; j < n2; j++)
     {
         R[j] = arr[q + j + 1];
     }
 
     int i = 0;
     int j = 0;
     int k = p;
 
     while((i < n1) && (j < n2))
     {
         if(L[i] <= R[j])
         {
             arr[k] = L[i];
             i++;
         }
         else
         {
             arr[k] = R[j];
             j++;
         }
         k++;
     }
 
     if (i < n1)
     {
         for(; i < n1; i++, k++)
         {
             arr[k] = L[i];
         }
     }
     if (j < n2)
     {
         for(; j < n2; j++, k++)
         {
             arr[k] = R[j];
         }
     }
 }
 
 void mergesort(int* arr, int p, int r)
 {
     int q = 0;
     if(p < r)
     {
         q = (p + r) / 2;
         mergesort(arr, p, q);
         mergesort(arr, q + 1, r);
         merge(arr, p, q, r);
     }
 }
 
 int main()
 {
     int a[] = {5, 2, 4, 7, 1, 3, 2, 6};
     mergesort(a, 0, 7);
     for(int i = 0; i < 8; i++)
     {
         cout << a[i] << " ";
     }
     cout << endl;
     return 0;
 }

非遞歸代碼實現:

/**
  * merge_sort: 非遞歸實現 --迭代
  * 非遞歸思想: 將數組中的相鄰元素兩兩配對。用merge函數將他們排序,
  * 構成n/2組長度為2的排序好的子數組段,然后再將他們排序成長度為4的子數組段,
  * 如此繼續下去,直至整個數組排好序。
 *
*/

 #include <stdio.h>
 #include <stdlib.h>

 // merge_sort(): 非遞歸實現-自底向上
 
// 將原數組劃分為left[minmax] 和 right[minmax]兩部分
 void merge_sort(int *list, int length)
 {
     int i, left_min, left_max, right_min, right_max, next;
     int *tmp = (int*)malloc(sizeof(int) * length);

     if (tmp == NULL)
     {
         fputs("Error: out of memory\n", stderr);
         abort();
     }

     for (i = 1; i < length; i *= 2) // i為步長,1,2,4,8……
     {
         for (left_min = 0; left_min < length - i; left_min = right_max)
         {
             right_min = left_max = left_min + i; //right_min取left_max的值,以下要用到left_max的值才不會改變left_max原先值
             right_max = left_max + i;

             if (right_max > length) //如果right_max超出了數組長度,則right_max等于數組長度
                 right_max = length;

             next = 0;
             while (left_min < left_max && right_min < right_max) //tmp[next]存儲子數組中的最小值
                 tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];

             while (left_min < left_max)  //如果left_min小于left_max,則將最小值原封不動地賦給list[--right_min],right_min 要先減1
                 list[--right_min] = list[--left_max];

             while (next > 0) //將tmp[next]存儲的最小值放入list[--right_min]中
                 list[--right_min] = tmp[--next];
         }
         if(i == 1) //打印第一次歸并后的數字排列
         {
             for(int j=0;j<length;j++)
               printf("%d ",list[j]);
             printf("\n");
         }
     }

     free(tmp);

 }


 int main()
 {
     int a[1000],t,i;
     scanf("%d",&t);
     for(i=0;i<t;i++)
     {
         scanf("%d",&a[i]);
     }
     merge_sort(a, t);

     // print array
     for (i = 0; i < t; i++)
         printf("%d ", a[i]);

     return 0;
 }
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品美女久久福利网站| 男男成人高潮片免费网站| 亚洲免费高清视频| 欧美中文字幕第一页| 欧美v日韩v国产v| 国产美女一区| 日韩视频一区| 蜜桃视频一区| 亚洲影院一区| 欧美日韩大陆在线| 亚洲国产精品国自产拍av秋霞| 亚洲男同1069视频| 亚洲级视频在线观看免费1级| 99精品视频免费在线观看| 久久婷婷亚洲| 一区三区视频| 久久久久一区二区三区| 亚洲欧美日韩一区二区在线 | 99热这里只有精品8| 欧美不卡高清| 葵司免费一区二区三区四区五区| 男人天堂欧美日韩| 亚洲一区二区不卡免费| 欧美精品粉嫩高潮一区二区| 在线观看亚洲视频| 久久久99精品免费观看不卡| 亚洲一区国产精品| 国产精品福利网| 亚洲欧美综合精品久久成人| 夜久久久久久| 国产精品免费aⅴ片在线观看| 亚洲在线一区二区三区| 日韩一区二区高清| 欧美日韩一区二| 亚洲女人天堂av| 亚洲一区二区三区色| 国产精品国码视频| 久久不射网站| 久久国产精品色婷婷| 一区二区视频免费完整版观看| 久久久久久久一区二区三区| 久久不射网站| 亚洲第一二三四五区| 欧美激情一级片一区二区| 麻豆精品精品国产自在97香蕉| 亚洲国产精品悠悠久久琪琪| 亚洲国产精品一区制服丝袜| 欧美日韩一区二区高清| 亚洲男人第一网站| 久久精品国产亚洲一区二区三区| 在线欧美影院| 亚洲夫妻自拍| 国产精品第一区| 久久久午夜电影| 欧美成人高清视频| 正在播放欧美一区| 午夜亚洲激情| 亚洲黄一区二区| 一区二区三区免费在线观看| 国产亚洲精品资源在线26u| 欧美成人精品高清在线播放| 欧美另类极品videosbest最新版本| 亚洲欧美国产视频| 久久精品一级爱片| a4yy欧美一区二区三区| 欧美一级免费视频| 91久久精品网| 亚洲一区精彩视频| 亚洲黄色视屏| 亚洲欧美日韩国产精品 | 亚洲国产精品成人| 国产精品女人网站| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美精品激情blacked18| 欧美一区二区三区四区夜夜大片| 久久婷婷丁香| 欧美一级在线亚洲天堂| 男女av一区三区二区色多| 欧美中文在线观看国产| 欧美激情亚洲另类| 久久婷婷国产麻豆91天堂| 欧美日韩精品免费观看视一区二区| 久久精品视频免费播放| 久久精品中文字幕一区| 国内精品视频在线观看| 午夜在线视频一区二区区别| 久久亚洲欧洲| 欧美在线啊v| 欧美三级电影精品| 亚洲第一天堂av| 国产一区二区三区在线免费观看| 亚洲日产国产精品| 亚洲国产日韩欧美综合久久 | 亚洲激情视频网| 欧美一级淫片播放口| 亚洲在线中文字幕| 欧美视频国产精品| 亚洲精品免费网站| 亚洲欧洲在线看| 久久亚洲私人国产精品va| 久久精品噜噜噜成人av农村| 欧美视频一区二区三区…| 91久久精品国产91性色| 亚洲黄色大片| 欧美大片专区| 欧美激情视频一区二区三区不卡| 黑人巨大精品欧美一区二区| 销魂美女一区二区三区视频在线| 亚洲欧美在线x视频| 国产精品久久久久久久久搜平片 | 亚洲三级视频在线观看| 久久久久看片| 欧美1区2区3区| 合欧美一区二区三区| 久久成人综合视频| 久久精品中文| 国产小视频国产精品| 香蕉乱码成人久久天堂爱免费 | 欧美理论视频| 一区二区精品国产| 亚洲欧美另类国产| 国产精品拍天天在线| 亚洲一区在线播放| 久久久久国产精品人| 在线日韩欧美视频| 免费观看久久久4p| 亚洲精品韩国| 午夜精品美女自拍福到在线| 国产精品一区二区a| 亚洲欧美日韩直播| 久久久久看片| 亚洲激情第一页| 欧美日韩精品一区二区在线播放 | 在线观看国产精品网站| 久久视频国产精品免费视频在线| 蜜臀a∨国产成人精品| 最近中文字幕日韩精品| 欧美精品网站| 亚洲少妇中出一区| 久久精品国产99国产精品澳门| 欧美日韩成人| 久久精品麻豆| 亚洲高清久久| 欧美人妖在线观看| 亚洲在线观看视频| 免费观看成人www动漫视频| 亚洲精品国精品久久99热| 国产精品国产三级国产普通话99 | 一本一本久久| 国产乱肥老妇国产一区二| 久久免费黄色| av成人免费在线观看| 久久免费黄色| 夜夜嗨av一区二区三区网站四季av | 国产精品日韩欧美一区| 久久精品国产99精品国产亚洲性色| 欧美成人午夜视频| 亚洲天堂第二页| 一区二区三区在线看| 欧美体内she精视频在线观看| 性刺激综合网| 亚洲毛片一区二区| 裸体丰满少妇做受久久99精品| 99精品国产在热久久婷婷| 国产亚洲制服色| 欧美日韩国产91| 久久久免费av| 亚洲自拍偷拍网址| 亚洲国产高潮在线观看| 久久精品在线视频| 亚洲精品中文字| 国产麻豆日韩| 欧美成年网站| 久久婷婷蜜乳一本欲蜜臀| 午夜久久福利| 亚洲狠狠丁香婷婷综合久久久| 亚洲欧美日韩一区在线观看| 亚洲欧洲免费视频| 国内精品久久久久影院色| 美女日韩欧美| 午夜在线视频观看日韩17c| 亚洲黄色在线看| 韩国一区电影| 国产精品一香蕉国产线看观看| 欧美大香线蕉线伊人久久国产精品| 香蕉成人久久| 先锋影音久久| 亚洲视频视频在线| 亚洲六月丁香色婷婷综合久久| 欧美aⅴ一区二区三区视频| 午夜视频在线观看一区二区三区| 99re66热这里只有精品3直播| 亚洲高清激情| 亚洲第一黄色| 在线欧美三区| 亚洲第一在线综合在线| 国产一区二区中文字幕免费看| 国产精品日产欧美久久久久| 欧美日韩一区二区三区在线看| 欧美精品xxxxbbbb|