归并排序(非递归算法)

转自 http://blog.csdn.net/pigli/article/details/5755261

归并排序:

    将无序的序列划分成若干的子序列,然后将相邻的子序列归并到一个序列,这个归并过程一直继续下去,直到序列只有两个子序列,将这最后的两个子序列归并完成后,也即是排序完毕,得到的就是一个有序的序列。其中归并的过程也即是相邻两个子序列之间的排序问题。这是归并排序的基本原理。

    那么,思路也就是,在一趟排序中先将序列分成若干个子序列,然后再将相邻的子序列进行归并。将序列分成若干子序列,具体分法依赖于子序列的长度,确定了子序列的长度自然分成若干子序列也就不难了。长度L=2*趟数。将相邻子序列进行归并,实际上是进行将一个序列插入到另一个序列的操作。

    在这个过程中,需要借助一个与序列长度一致的数组空间,对暂排序列进行存储。

    这是一个非递归实现的思路。而二路归并算法也可以用递归实现它。下面是二路归并的非递归算法。

 

[java] view plaincopy
 
  1. package Sort;  
  2. /* 
  3.  * 自底向顶二路归并:第一趟子序列的长度为1,第二趟子序列长度为1*2。。。。 
  4.  */  
  5. public class MergingSort   
  6. {  
  7.     private int[] array1 ;  
  8.     private int[] array2 ;  
  9.     private int length;  
  10.       
  11.     public MergingSort(int[] array)  
  12.     {  
  13.         this.array1 = array;  
  14.         this.array2 = new int[array.length];  
  15.         this.length = array.length;  
  16.     }  
  17.       
  18.     public void sort()  
  19.     {  
  20.         int sublength =1;  
  21.         int count =1;  
  22.         while(sublength<length)  
  23.         {  
  24.             int m =0;  
  25.             while((m+sublength)<=length)  
  26.             {  
  27.                 if(m+2*sublength<length)  
  28.                 {  
  29.                     if(count%2!=0)  
  30.                     {  
  31.                         merging(array1,array2,m,m+sublength-1,m+2*sublength-1);  
  32.                     }  
  33.                     else  
  34.                     {  
  35.                         merging(array2,array1,m,m+sublength-1,m+2*sublength-1);  
  36.                     }  
  37.                 }  
  38.                 else  
  39.                 {  
  40.                     if(count%2!=0)  
  41.                     {  
  42.                         merging(array1,array2,m,m+sublength-1,length-1);  
  43.                     }  
  44.                     else  
  45.                     {  
  46.                         merging(array2,array1,m,m+sublength-1,length-1);  
  47.                     }  
  48.                 }  
  49.                 m = m+2*sublength;  
  50.             }  
  51.             count++;  
  52.             sublength = sublength*2;  
  53.         }  
  54.         if(count%2!=0)  
  55.         {  
  56.             array2 = array1;  
  57.         }  
  58.     }  
  59.       
  60.       
  61.     private void merging(int[] array1,int[] array2,int low,int mid,int high)  
  62.     {  
  63.         int i = low;  
  64.         int j = mid+1;  
  65.         int k =low;  
  66.         for(; i<=mid&&j<=high;k++)  
  67.         {  
  68.             if(array1[i]<array1[j])  
  69.             {  
  70.                 array2[k] = array1[i];  
  71.                 i++;  
  72.             }  
  73.             else  
  74.             {  
  75.                 array2[k] = array1[j];  
  76.                 j++;  
  77.             }  
  78.         }  
  79.         if(i<=mid)  
  80.         {  
  81.             for(;i<=mid;i++ )  
  82.             {  
  83.                 array2[k] = array1[i];  
  84.                 k++;  
  85.             }  
  86.         }  
  87.         if(j<=high)  
  88.         {  
  89.             for(;j<=high;j++)  
  90.             {  
  91.                 array2[k] = array1[j];  
  92.                 k++;  
  93.             }  
  94.         }  
  95.     }  
  96.       
  97.     public void sort_Recursion()  
  98.     {  
  99.           
  100.     }  
  101.       
  102.     public void print()  
  103.     {  
  104.         for(int i=0;i<array2.length;i++)  
  105.         {  
  106.             System.out.print(array2[i]+"     ");  
  107.         }  
  108.     }  
  109.       
  110.     public static void main(String args[])  
  111.     {  
  112.         int[] array = {23,24,23,54,35,54,76,36,48,95,20,54};  
  113.         MergingSort merginArray = new MergingSort(array);  
  114.         merginArray.sort();  
  115.         merginArray.print();  
  116.     }  
  117.       

 

posted @ 2014-06-13 02:19  princessd8251  阅读(324)  评论(0)    收藏  举报