posts - 15,comments - 65,trackbacks - 0
                  本文最先發(fā)布于本人個人博客http://www.lovestblog.cn
                  下面簡單的說說歸并排序,所謂歸并排序就是說把輸入數(shù)組分成兩組當(dāng)然也可以大于2組,一般我們是等量的分成2組,通過遞歸我們可以把長度為n的數(shù)組分成n個數(shù)組,我們通過一定的關(guān)鍵字比較把兩兩結(jié)合成一個有序的數(shù)組,然后回溯到原數(shù)組大小的有序數(shù)組,具體的我就不多說了,因?yàn)楸容^簡單,到網(wǎng)上可以找些相關(guān)文章看看什么是歸并排序,歸并排序算法可以再O(nlogn)的時間內(nèi)對長度為n的序列完成排序,至于合并兩個有序數(shù)組,假如這兩個數(shù)組的長度分別為m和n,那么我們只需要O(n+m)的時間久可以完成對這兩個有序數(shù)組的合并,下面還是代碼說明之:
          package org.rjb.Sort;
          /**
           * 歸并排序(升序排列)
           * 
          @author ljp
           *
           
          */

          public class MergeSort {
              
          /**
               * 對原始數(shù)組進(jìn)行平等劃分為兩個子數(shù)組
               * 
          @param nums
               
          */

              
          public static void sort(int[] nums){
                  
          int n=nums.length;
                  
          if(n<=1)
                      
          return;
                  
          int nums1[]=new int[n/2];
                  
          int nums2[]=new int[n-n/2];
                  
          for(int i=0,j=nums1.length;j<nums.length;i++,j++){
                      
          if(i<nums1.length){
                          nums1[i]
          =nums[i];
                      }

                      nums2[i]
          =nums[j];
                  }

                  
          //遞歸對子數(shù)組進(jìn)行劃分
                  sort(nums1);
                  sort(nums2);
                  
          //把子數(shù)組排序后的結(jié)果進(jìn)行合并
                  merge(nums,nums1,nums2);
              }

              
          /**
               * 合并兩個有序的子數(shù)組為一個有序的數(shù)組
               * 
          @param nums 合并之后的數(shù)組
               * 
          @param num1 有序的子數(shù)組
               * 
          @param num2 有序的子數(shù)組
               
          */

              
          public static void merge(int[] nums,int num1[],int num2[]){
                  
          int n1=num1.length-1;
                  
          int n2=num2.length-1;
                  
          int k=0;
                  
          int k1=0,k2=0;
                  
          while(k1<=n1||k2<=n2){
                      
          int e=0;
                      
          if(k1>n1){//如果第一個數(shù)組已經(jīng)全部比較完了,那么我們只要直接復(fù)制第二個數(shù)組的條目到合并數(shù)組中即可
                          e=num2[k2++];
                      }
          else if(k2>n2){//如果第二個數(shù)組已經(jīng)全部比較完了,那么我們只要直接復(fù)制第一個數(shù)組的條目到合并數(shù)組中即可
                          e=num1[k1++];
                      }
          else if(num1[k1]>num2[k2]){//把比較的兩個條目中關(guān)鍵值小的放到合并數(shù)組中
                          e=num2[k2++];
                      }
          else{
                          e
          =num1[k1++];
                      }

                      nums[k
          ++]=e;
                  }

              }

              
          /**
               * 主函數(shù)
               * 
          @param args
               
          */

              
          public static void main(String args[]){
                  
          int[] nums={10,2,3,7,4,9,1};
                  sort(nums);
                  
          for(int i=0;i<nums.length;i++){
                      System.out.print(nums[i]
          +" ");
                  }
          System.out.println();
              }

          }

          posted on 2009-05-29 16:55 你假笨 閱讀(1228) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 霸州市| 平度市| 瑞金市| 霍州市| 阿拉善右旗| 山西省| 高阳县| 泸定县| 荆州市| 鲁甸县| 奎屯市| 株洲县| 庄河市| 宁波市| 林口县| 星子县| 滨海县| 丰城市| 庄河市| 高清| 安泽县| 察雅县| 昌乐县| 建阳市| 资讯 | 邹城市| 新巴尔虎左旗| 碌曲县| 开阳县| 桦南县| 天水市| 饶平县| 凌源市| 大足县| 克山县| 炎陵县| 贵定县| 亳州市| 阆中市| 新绛县| 舒兰市|