【排序算法】归并排序

来源:互联网 发布:流星网络电视app 编辑:程序博客网 时间:2024/06/15 19:26

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


归并操作的工作原理如下:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

设定两个指针,最初位置分别为两个已经排序序列的起始位置

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针达到序列尾

将另一序列剩下的所有元素直接复制到合并序列尾



代码如下:

[cpp] view plaincopyprint?
  1. /******************************************************************************** 
  2.  
  3. ** auth: Vincent Lau 
  4.  
  5. ** mail:  985632368@qq.com 
  6.  
  7. ** date: 2015.6.22  
  8.  
  9. ** desc:  
  10.  
  11. ** Ver : V1.0.0  
  12.  
  13. *********************************************************************************/  
  14.   
  15. #include<iostream>  
  16. #define SIZE 21    
  17. #include<list>  
  18. typedef int Sqlist[SIZE];  
  19.   
  20. using namespace std;  
  21.   
  22.   
  23. //====================================Merge()===================================  
  24. /// @brief <对函数进行概括说明>  合并  
  25. ///  
  26. /// <对函数进行详细说明>  
  27.   
  28. ///  
  29. /// @remark <函数特别说明>  将数组中连续的两个子序列合并为一个有序序列   
  30. //================================================================================  
  31. void Merge(Sqlist &L, int left, int mid, int right)  
  32. {  
  33.     Sqlist L1;                  //开辟等大空间  
  34.       
  35.     for (int i = 0; i < SIZE; ++i)  
  36.     {  
  37.         L1[i] = L[i];  
  38.     }  
  39.     int s1 = left;  
  40.     int s2 = mid+1;  
  41.     int k = left;  
  42.   
  43.     while (s1 <= mid && s2 <= right)      //左右有序两部分合并  
  44.     {  
  45.         if (L1[s1] < L1[s2])  
  46.             L[k++] = L1[s1++];  
  47.         else  
  48.             L[k++] = L1[s2++];  
  49.     }  
  50.         while (s1 <= mid)                //长度不同的情况  
  51.         {  
  52.             L[k++] = L1[s1++];  
  53.         }  
  54.         while (s2 <= right)  
  55.         {  
  56.             L[k++] = L1[s2++];  
  57.         }  
  58. }  
  59.   
  60. //==================================MergeSort()=================================  
  61. /// @brief <对函数进行概括说明>  MergeSort  
  62. ///  
  63. /// @remark <函数特别说明>  自底向上的归并排序  
  64. ///  
  65.   
  66. /// @sa <可以参考的类或函数,用空格分隔,函数名称后必须加()>  Merge()  
  67. //================================================================================  
  68. void MergeSort(Sqlist &L, int left, int right)  
  69. {  
  70.     if (left >= right)  
  71.         return;  
  72.   
  73.     int mid = (left + right) / 2;  
  74.   
  75.     MergeSort(L,left,mid);          //递归左部分排序  
  76.     MergeSort(L, mid+1, right);     //递归右部分排序  
  77.     Merge(L,left, mid, right);      //合并  
  78.   
  79.   
  80. }  
  81.   
  82. void main(void)  
  83. {  
  84.     Sqlist L = { 49, 38, 65, 97, 76, 13, 27, 49 };  
  85.   
  86.     cout << "原数组为:" << endl;  
  87.   
  88.     for (int i = 0; i < 8; ++i)  
  89.     {  
  90.         cout << L[i] << " ";  
  91.     }  
  92.     cout << endl;  
  93.   
  94.     MergeSort(L, 0, 7);  
  95.   
  96.     cout << "归并排序:" << endl;  
  97.   
  98.     for (int i = 0; i < 8; ++i)  
  99.     {  
  100.         cout << L[i] << " ";  
  101.     }  
  102.     cout << endl;  
  103. }  

运行结果:


0 0
原创粉丝点击