排序(四)——关于归并排序

来源:互联网 发布:原单厂家直拿wsj淘宝 编辑:程序博客网 时间:2024/05/01 04:06
参考:维基百科 以及 数据结构与算法分析——Java语言描述  (Mark Allen Weis

        归并排序算法的时间复杂度是 O(n logn)  ,最差空间复杂度O(n) ,是稳定的排序算法。

        它是建立在归并操作上的一种有效的排序算法,是采用分治法Divide and Conquer)的一个非常典型的应用。这个算法中的基本的操作是合并两个已排序的表。归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

         下面的这幅图片说明了这个过程:

        代码如下:

[java] view plaincopyprint?
  1. public class Sort { 
  2.  
  3.     public staticvoid main(String[] args) { 
  4.  
  5.          Sort sort= new Sort();  
  6.          int[] a={0,56,89,3,9,0,1,4,28,655,48,478,58,2658,98,145,33,66652,14,14}; 
  7.          sort.mergeSort(a); 
  8.          for(int i=0;i<a.length;i++) 
  9.           System.out.println(a[i]); 
  10.  
  11.     } 
  12.      /**
  13.       * @param a:要排序的数组
  14.       */ 
  15.     public void mergeSort(int[] a){ 
  16.          
  17.         int[] tmpArr=newint[a.length]; 
  18.         mergeSort(a, tmpArr, 0, a.length-1); 
  19.          
  20.     } 
  21.     /**
  22.      *
  23.      * @param a:要排序的数组
  24.      * @param tmpArr:
  25.      * @param left:开始下标
  26.      * @param right:结束下标
  27.      */ 
  28.     public void mergeSort(int[] a,int[] tmpArr,int left,int right){ 
  29.          
  30.         if(left<right){ 
  31.             int center=(left+right)/2
  32.             mergeSort(a, tmpArr, left, center); 
  33.             mergeSort(a, tmpArr, center+1, right); 
  34.             merge(a, tmpArr, left, center, right); 
  35.         }        
  36.     } 
  37.     /**
  38.      * 合并两个有序序列
  39.      * @param a:这两个有序序列其实是a的左右部分
  40.      * @param tmpArr:用来存放合并结果的临时数组
  41.      * @param lBegin:左边序列的开始下标
  42.      * @param lEnd:左边序列的结束下标
  43.      * @param rEnd:右边序列的结束下标
  44.      */ 
  45.     public void merge(int[] a,int[] tmpArr,int lBegin,int lEnd,int rEnd){ 
  46.          
  47.         int num=rEnd-lBegin+1
  48.         int rBegin=lEnd+1
  49.         int tmpPos=lBegin; 
  50.         while(lBegin<=lEnd && rBegin<=rEnd) 
  51.             if(a[lBegin]<=a[rBegin]) 
  52.                 tmpArr[tmpPos++]=a[lBegin++]; 
  53.             else 
  54.                 tmpArr[tmpPos++]=a[rBegin++]; 
  55.          
  56.          while (lBegin<=lEnd) 
  57.                 tmpArr[tmpPos++]=a[lBegin++]; 
  58.           
  59.          while(rBegin<=rEnd) 
  60.               tmpArr[tmpPos++]=a[rBegin++]; 
  61.           
  62.          // tmpArr是排好序的数据,将它copy回a,注意方式,因为我们不知道开始下标,却知道结束下标 
  63.          for(int i=0;i<num;i++) 
  64.          { 
  65.              a[rEnd]=tmpArr[rEnd]; 
  66.              rEnd--; 
  67.          }       
  68.     } 
原创粉丝点击