隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告

          關(guān)注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網(wǎng)站

          關(guān)注的網(wǎng)站

          協(xié)議

          喜歡的Blog

          國內(nèi)廣告平臺

          圖書出版

          在線培訓

          開發(fā)工具

          微博客戶端

          手機鈴聲

          操作系統(tǒng)

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統(tǒng)

          數(shù)學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1973567
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          歸并排序(merge sort)算法實現(xiàn)

              歸并排序(merge sort)體現(xiàn)了分治的思想,即將一個待排序數(shù)組分為兩部分,對這兩個部分進行歸并排序,排序后,再對兩個已經(jīng)排序好的數(shù)組進行合并。這種思想可以用遞歸方式很容易實現(xiàn)。歸并排序的時間復雜度為O(nlogn),空間復雜度為O(n)

          實現(xiàn)代碼如下:
          #include <stdio.h> 
          #include 
          "common.h"  
          void merge(int data[], int p, int q, int r) 
          {     
              
          int i, j, k, n1, n2;     
              n1 
          = q - p + 1;     
              n2 
          = r - q;     
              
          int L[n1];     
              
          int R[n2];      
              
          for(i = 0, k = p; i < n1; i++, k++)         
                  L[i] 
          = data[k];     
              
          for(i = 0, k = q + 1; i < n2; i++, k++)         
                  R[i] 
          = data[k];     
              
          for(k = p, i = 0, j = 0; i < n1 && j < n2; k++)     
              {         
                  
          if(L[i] > R[j])         
                  {             
                      data[k] 
          = L[i];             
                      i
          ++;         
                  }         
                  
          else         
                  {             
                      data[k] 
          = R[j];             
                      j
          ++;         
                  } 
              }
              
          if(i < n1)     
              {         
                  
          for(j = i; j < n1; j++, k++)             
                  data[k] 
          = L[j];     
              }     
              
          if(j < n2)     
              {         
                  
          for(i = j; i < n2; i++, k++)             
                      data[k] 
          = R[i];     
              }  
          }
          void merge_sort(int data[], int p, int r) 
          {     
              
          if(p < r)     
              {         
                  
          int q = (p + r) / 2;         
                  merge_sort(data, p, q);         
                  merge_sort(data, q 
          + 1, r);         
                  merge(data, p, q, r);     
              } 


          void test_merge_sort() 
          {   
              
          int data[] = {4412145-123-10121};     
              printf(
          "-------------------------------merge sort----------------------------\n");    
              out_int_array(data, 
          7);     
              merge_sort(data, 
          06);     
              out_int_array(data, 
          7); 


          int main() 
          {    
              test_merge_sort();    
              
          return 0
          }  




          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-05-14 22:57 銀河使者 閱讀(3277) 評論(4)  編輯  收藏 所屬分類: C/C++

          評論

          # re: 歸并排序(merge sort)算法實現(xiàn)  回復  更多評論   

          歸并排序體現(xiàn)了分治的思想,很有價值
          2008-05-16 12:19 | 網(wǎng)上買書

          # re: 歸并排序(merge sort)算法實現(xiàn)  回復  更多評論   

          使用分治法實現(xiàn)基本正確。但是merge函數(shù)中有兩個數(shù)組的定義:
          int L[n1];
          int R[n2];
          在維數(shù)處使用了變量,不對。靜態(tài)數(shù)組的維數(shù)必須在編譯時確定,運行時動態(tài)給定數(shù)組維數(shù)需要使用動態(tài)內(nèi)存分配。所以merge函數(shù)和mergesort函數(shù)都需要修改。

          http://zhidao.baidu.com/question/75588993.html
          2009-02-15 21:04 | 剛哥

          # re: 歸并排序(merge sort)算法實現(xiàn)  回復  更多評論   

          @剛哥
          這算法是很多年前寫的,現(xiàn)在看看寫成用變量定義數(shù)組了。估計是用Java用多了,不小心寫成Java格式的了。以前這些算法好象都調(diào)試過,可能是這個沒測試過。可能當初是寫的示意代碼。基本上都忘了細節(jié)了。^_^
          2009-02-15 22:46 | 銀河使者

          # re: 歸并排序(merge sort)算法實現(xiàn)  回復  更多評論   

          @剛哥
          你的那個是C++的算法,基本思路類型,都是數(shù)據(jù)結(jié)構(gòu)講的,哈哈!!這些數(shù)據(jù)結(jié)構(gòu)書上都有,看看就知道了!
          2009-02-15 22:47 | 銀河使者
          主站蜘蛛池模板: 仙游县| 长汀县| 林口县| 合阳县| 孟连| 乌鲁木齐县| 芮城县| 来宾市| 海阳市| 罗江县| 榆中县| 永和县| 满洲里市| 漳平市| 江北区| 社旗县| 十堰市| 南乐县| 明光市| 寿阳县| 嘉义市| 禄丰县| 崇明县| 呼图壁县| 陆良县| 方城县| 吴旗县| 嘉鱼县| 西乡县| 原平市| 即墨市| 元谋县| 永修县| 湘潭县| 尼玛县| 德格县| 阿克苏市| 桦川县| 朝阳县| 阜南县| 丰县|