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

          public class MergeSort {
              
          /**
               * 對原始數組進行平等劃分為兩個子數組
               * 
          @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];
                  }

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

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

              
          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){//如果第一個數組已經全部比較完了,那么我們只要直接復制第二個數組的條目到合并數組中即可
                          e=num2[k2++];
                      }
          else if(k2>n2){//如果第二個數組已經全部比較完了,那么我們只要直接復制第一個數組的條目到合并數組中即可
                          e=num1[k1++];
                      }
          else if(num1[k1]>num2[k2]){//把比較的兩個條目中關鍵值小的放到合并數組中
                          e=num2[k2++];
                      }
          else{
                          e
          =num1[k1++];
                      }

                      nums[k
          ++]=e;
                  }

              }

              
          /**
               * 主函數
               * 
          @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 你假笨 閱讀(1224) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 宁明县| 财经| 木兰县| 阜康市| 青铜峡市| 扎囊县| 黄平县| 镇巴县| 河东区| 瑞丽市| 综艺| 蕉岭县| 舞阳县| 郴州市| 全州县| 武宁县| 海盐县| 桐乡市| 乡宁县| 正定县| 西乌| 湘潭县| 富顺县| 泗水县| 尚志市| 绥阳县| 繁峙县| 吴旗县| 金湖县| 乌兰县| 泰兴市| 百色市| 新河县| 平阳县| 洪江市| 海晏县| 故城县| 库伦旗| 丹江口市| 德江县| 萨迦县|