<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    so true

    心懷未來(lái),開(kāi)創(chuàng)未來(lái)!
    隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
    數(shù)據(jù)加載中……

    一個(gè)較為復(fù)雜的二路歸并算法

    /*

    作者:bacoo
    日期:2008年9月21日

    一個(gè)比較復(fù)雜的二路歸并排序算法,完成由小到大的排序功能

    算法摒除了最初始的“從兩路頭部依次取出數(shù)據(jù),經(jīng)過(guò)比較后輸出較小值”方法;

    而是找出“頭大”的一路,然后把另一路分成許多片斷,然后插入到“頭大”的那路中,

    這里面尋找插入點(diǎn)使用了二分法查找以提高效率,

    需要說(shuō)明的是,該算法在兩部“交錯(cuò)”不是很?chē)?yán)重的情況下有較好的效率。

    */

    #include <iostream>
    using namespace std;

    int find2fenfa(int a[],int h,int t,int num){//利用二分法來(lái)查找num的位置,要求在[h,t]之間
     while(h<t){
      int m=(h+t)/2;
      if(num==a[m]){
       return m;
      }
      else if(num<a[m])
       t=m-1;
      else
       h=m+1;
     }
     return h;//這只給出一個(gè)推薦位置,也即最相關(guān)位置,在后續(xù)應(yīng)用該結(jié)果時(shí),需要做分析處理
    }

    void movedata(int a[],int pos,int h,int t){//該函數(shù)用于將[h,t]區(qū)間內(nèi)的數(shù)據(jù)移動(dòng)到pos指定的插入位置
     int s;
     if(pos>t){//插入點(diǎn)在后方
      for(int i=t;i>=h;i--){
       s=a[i];
       for(int j=i;j<pos-1;j++){
        a[j]=a[j+1];
       }
       a[--pos]=s;
      }
     }
     else if(pos<h){//插入點(diǎn)在前方
      for(int i=h;i<=t;i++){
       s=a[i];
       for(int j=i;j>pos;j--){
        a[j]=a[j-1];
       }
       a[pos++]=s;
      }
     }
    }

    void merge2(int a[],int h1,int t1,int h2,int t2)//該函數(shù)用于兩路合并,h和t分別表示頭部和尾部
    {
     if( h1>t1 || h2>t2 )return;
     int i_pos=-1,s_end=-1;
     if(a[h1]<=a[h2]){//確保都是為一個(gè)大數(shù)查找插入的位置
      i_pos=find2fenfa(a,h1,t1,a[h2]);
      a[i_pos]<=a[h2] ? i_pos++ : i_pos;//根據(jù)推薦位置對(duì)應(yīng)的數(shù)值大小來(lái)調(diào)整合適的插入點(diǎn)
      if(i_pos>t1)return;//已經(jīng)有序,不必再合并了
      s_end=find2fenfa(a,h2,t2,a[i_pos]);//為待插入的部分找到一個(gè)終點(diǎn),起始點(diǎn)已經(jīng)由h2來(lái)標(biāo)記了
      a[s_end]>=a[i_pos] ? s_end-- : s_end;//微調(diào),很必要的
      movedata(a,i_pos,h2,s_end);
      merge2(a,i_pos+s_end-h2,s_end,s_end+1,t2);
     }else{
      i_pos=find2fenfa(a,h2,t2,a[h1]);
      a[i_pos]<=a[h1] ? i_pos++ : i_pos;
      if(i_pos>t2){
       movedata(a,h1,h2,t2);
       return;
      }
      s_end=find2fenfa(a,h1,t1,a[i_pos]);
      a[s_end]>=a[i_pos] ? s_end-- : s_end;
      movedata(a,i_pos,h1,s_end);
      merge2(a,h1,t1-(s_end-h1+1),t1-s_end+h1,t2);
     }
    }

    void sort_2way(int a[],int len){//兩路歸并,這個(gè)函數(shù)主要是為merge2函數(shù)每次分配合適的兩路
     int x=1;//表示當(dāng)前進(jìn)行的兩路歸并中的“路的長(zhǎng)度”
     int h1,t1,h2,t2;
     while(x<=len){
      for(int i=0;i<len;i+=2*x){
       h1=i;
       h2=i+x;
       t1=h2-1;
       t2=h2+x-1;
       if(h2>=len)continue;
       else{
        if(t2>=len){
         merge2(a,h1,t1,h2,len-1);
         break;
        }else
         merge2(a,h1,t1,h2,t2);
       }
      }
      x*=2;
     }
    }

    void main(){
     int a[10];
     int len=sizeof(a)/sizeof(a[0]);
     for(int i=0;i<len;i++)a[i]=rand()%100;

     sort_2way(a,len);
     
     for(i=0;i<len;i++)cout<<a[i]<<endl;
     
    }

     

    單次運(yùn)行結(jié)果為:

    0
    24
    34
    41
    58
    62
    64
    67
    69
    78
    Press any key to continue

    posted on 2008-09-21 01:21 so true 閱讀(498) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): C&C++

    評(píng)論

    # re: 一個(gè)較為復(fù)雜的二路歸并算法  回復(fù)  更多評(píng)論   

    首先聲明一下:我是本文的作者。
    寫(xiě)完這個(gè)代碼之后,到網(wǎng)上檢索了一下二路歸并算法的實(shí)現(xiàn),大多數(shù)都是最原始的那種做法,而其還需要輔助數(shù)組,其實(shí)我覺(jué)得也可以完全不用輔助數(shù)組,不過(guò)這就是空間與時(shí)間的矛盾之處,因?yàn)椴挥幂o助數(shù)組的話需要大量的移動(dòng)數(shù)據(jù),造成時(shí)間復(fù)雜度的提高。

    后來(lái)我回顧了一下我給出的算法,雖然編寫(xiě)調(diào)試了很長(zhǎng)時(shí)間才最終成功,但是依然很欣慰,好似還沒(méi)有其他人這么做,難道我有如此聰明?不至于吧,呵呵,反正竊喜一下,凌晨2點(diǎn),睡覺(jué)去^_^
    ………………
    2008-09-21 02:03 | bacoo

    # re: 一個(gè)較為復(fù)雜的二路歸并算法  回復(fù)  更多評(píng)論   

    好聰明的作者!長(zhǎng)見(jiàn)識(shí)了!
    請(qǐng)問(wèn)在哪高就???
    2008-10-04 19:51 | yball
    主站蜘蛛池模板: 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲欧洲在线观看| 亚洲中文字幕久久精品无码VA| 亚洲爆乳AAA无码专区| 欧美a级成人网站免费| 无码不卡亚洲成?人片| 久久久久久亚洲精品无码| caoporn成人免费公开| 国产四虎免费精品视频| 亚洲精品午夜视频| 91九色老熟女免费资源站| 中文字幕亚洲综合久久| 免费看片在线观看| 亚洲老熟女五十路老熟女bbw| 巨胸喷奶水www永久免费| 精品剧情v国产在免费线观看 | 91久久成人免费| 免费女人18毛片a级毛片视频| 久久精品国产亚洲AV电影| 黄色网页免费观看| 在线视频观看免费视频18| 亚洲日本VA中文字幕久久道具| 亚洲电影免费在线观看| 免费va人成视频网站全| 又大又硬又粗又黄的视频免费看| 久久天天躁狠狠躁夜夜免费观看| 夜夜春亚洲嫩草影院| 国产成人精品日本亚洲语音| 成人免费视频77777| 美国毛片亚洲社区在线观看| 亚洲中文无韩国r级电影 | 国产精品亚洲产品一区二区三区| 亚洲欧美国产欧美色欲| 99久久久国产精品免费无卡顿| 亚洲国产美国国产综合一区二区| 永久免费观看黄网站| 四虎永久精品免费观看| 久久精品私人影院免费看| 伊人久久五月丁香综合中文亚洲| 桃子视频在线观看高清免费完整| 久久亚洲私人国产精品vA |