歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)

歸并排序

  • 歸并排序圖
歸并排序圖.png
  • 遞歸實(shí)現(xiàn)簡介
    • 代碼示例

       mergesort(left,right,**a){
           if(left<right){
               int mid = 1/2(left+right);
               mergesort(left,mid,**a);
               mergesort(mid+1,right,**a);
               merge(a,b,left,right);
               copy(a,b,left,right);
           }
       }
      
    • 代碼解釋

      • mergesort方法是向下分裂的方法
      • merge是一個(gè)排序方法,對(duì)a中的元素用兩個(gè)指針移動(dòng)進(jìn)行比較存入b中
      • copy是一個(gè)賦值方法,把b中排序好的值給a
  • 非遞歸實(shí)現(xiàn)簡介
    • 代碼示例

       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);
       
           for(i=1;i<length;i*=2){
               right_min = left_max = left_min+i;
               right_max = left_max+i;
           
               if(right_max>length){
                   right_max = length;
               }
           
               next = 0;
               while(left_min<left_max&&right_min<right_max){
                   tmp[next++] = list[left_min]>list[right_min]?list[right_min++]:list[left_min++];
               }
               while(left_min < left_max){
                   list[--right_min] = list[--left_max];
               }
               while(next>0){
                   list[--right_min] = tmp[--next];
               }
           }
       }
      
    • 算法實(shí)現(xiàn)解釋

      • 代碼實(shí)現(xiàn)步驟(按照i=1,2,4依次進(jìn)行,都是相同的,所以只列出i=1的情況)
        • i=1:

           left[10],right[4]  
           left_min=0,left_max=1,right_min=1,right_max=2
           right_max<length
           雙指針移動(dòng)逐步比較直到有一邊到達(dá)尾部
           點(diǎn)睛之筆是最后的兩個(gè)while,
           第一個(gè)while是判斷當(dāng)left未移動(dòng)到尾部時(shí),將當(dāng)前指針指向的值及之后的移動(dòng)到隊(duì)尾
           如果是right未移動(dòng)到尾部,直接將tmp中的值按序賦值到list中即可
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,769評(píng)論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,835評(píng)論 0 11
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子...
    趙宇_阿特奇閱讀 1,908評(píng)論 0 2
  • 再多人對(duì)你的愛,也湊不出一個(gè)人對(duì)你完整的愛。而我們都想要那個(gè)喜歡的人的全部。我想要你的身體,你的每一寸肌膚;我想要...
    李阿冰閱讀 309評(píng)論 0 1