归并排序(转)

归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

 

排序基本思想是:

      将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素,将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素,重复步骤2,直到所有元素排序完毕  

 

速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列

归并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组

 

稳定           时间复杂度O(nlogn)   n大时较好

      

Java代码  收藏代码
  1. public class MergeSort {  
  2.     /** 
  3.      * 静态方法功能:给一个给定的数组用归并排序法排序 
  4.      * @param a:待排序数组 
  5.      * @param begin:开始下标 
  6.      * @param end:终止下标 
  7.      */  
  8.     public static void mergeSort(int a[], int begin, int end)  
  9.     {  
  10.         if (begin < end)  
  11.         {  
  12.             int a1[] = new int[end - begin + 1];  
  13.   
  14.             int begin0 = 0;  
  15.   
  16.             int mid = (begin + end) / 2;  
  17.   
  18.             mergeSort(a, begin, mid);  
  19.   
  20.             mergeSort(a, mid + 1, end);  
  21.   
  22.             int begin1 = begin;  
  23.   
  24.             int begin2 = mid + 1;  
  25.   
  26.             int end1 = mid;  
  27.   
  28.             int end2 = end;  
  29.   
  30.             for (int i = 0; i < a1.length; i++)  
  31.             {  
  32.                 if (begin1 <= end1 && begin2 <= end2)  
  33.                 {  
  34.                     if (a[begin1] < a[begin2])  
  35.                     {  
  36.                         a1[begin0] = a[begin1];  
  37.                         begin0++;  
  38.                         begin1++;  
  39.                     }  
  40.                     else  
  41.                     {  
  42.                         a1[begin0] = a[begin2];  
  43.                         begin0++;  
  44.                         begin2++;  
  45.                     }  
  46.                 }  
  47.                 else  
  48.                     break;  
  49.             }  
  50.   
  51.             if (begin1 <= end1)  
  52.             {  
  53.                 for (; begin0 < a1.length; begin0++)  
  54.                 {  
  55.                     a1[begin0] = a[begin1];  
  56.                     begin1++;  
  57.                 }  
  58.             }  
  59.             else  
  60.             {  
  61.                 for (; begin0 < a1.length; begin0++)  
  62.                 {  
  63.                     a1[begin0] = a[begin2];  
  64.                     begin2++;  
  65.                 }  
  66.             }  
  67.   
  68.             // 将排好序的结果填回原数组  
  69.             for (int i = 0; i < a1.length; i++)  
  70.             {  
  71.                 a[begin + i] = a1[i];  
  72.             }  
  73.         }  
  74.     }  
  75.       
  76.     public static void main(String[] args) throws Exception {  
  77.   
  78.         int[] a = { 4938659776132749 };  
  79.   
  80.         mergeSort(a, 0, a.length - 1);  
  81.   
  82.         for (int key : a) {  
  83.             System.out.format(" %d", key);  
  84.         }  
  85.     }  
  86.   
  87. }  
posted @ 2013-04-23 13:40  l_k_y  阅读(143)  评论(0编辑  收藏  举报