fengyv

http://www.cnblogs.com/fengyv

导航

数据结构 - 归并排序(merging sort)

Posted on 2014-06-17 21:18  fengyv  阅读(521)  评论(0编辑  收藏  举报

归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表.

归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort), 

但是归并排序是稳定排序, 而快速排序和堆排序则不是.

 

代码:

  1. /* 
  2.  * main.cpp 
  3.  * 
  4.  *  Created on: 2014.6.12 
  5.  *      Author: Spike 
  6.  */  
  7.   
  8. /*eclipse cdt, gcc 4.8.1*/  
  9.   
  10. #include <iostream>  
  11. #include <algorithm>  
  12. #include <iterator>  
  13.   
  14. using namespace std;  
  15.   
  16. /*参数: SR-输入数组, TR-输出数组, i至m:第一段有序, m+1至n:第二段有序*/  
  17. void Merge (const std::vector<int> SR, std::vector<int>& TR, int i, int m, int n)  
  18. {  
  19.     int j , k;  
  20.     for (j=m+1, k=i; i<=m && j<=n; ++k) {  
  21.         if (SR[i] < SR[j])  
  22.             TR[k] = SR[i++];  
  23.         else  
  24.             TR[k] = SR[j++];  
  25.     }  
  26.     if (i<=m)  
  27.         std::copy((SR.begin()+i), (SR.begin()+m+1), TR.begin()+k);  
  28.     if (j<=n)  
  29.         std::copy((SR.begin()+j), (SR.begin()+n+1), TR.begin()+k);  
  30. }  
  31.   
  32. /*参数: SR-输入数组, TR-输出数组, s:起始, t:末尾*/  
  33. void MSort (const std::vector<int> SR, std::vector<int>& TR, int s, int t)  
  34. {  
  35.     std::vector<int> tempTR(SR.size());  
  36.     if (s == t)  
  37.         TR[s] = SR[s];  
  38.     else {  
  39.         int m = (s+t)/2; //平分SR, SR[s..m]和SR[m+1..t]  
  40.         MSort(SR, tempTR, s, m); //前半段  
  41.         MSort(SR, tempTR, m+1, t); //后半段  
  42.         Merge(tempTR, TR, s, m, t); //排序  
  43.         //copy(TR.begin(), TR.end(), ostream_iterator<int>(cout, " "));  
  44.         //std::cout << std::endl;  
  45.     }  
  46. }  
  47.   
  48. void MergeSort (std::vector<int>& L) {  
  49.     MSort(L, L, 0, L.size()-1);  
  50. }  
  51.   
  52. int main (void)  
  53. {  
  54.     std::vector<int> L = {49, 38, 65, 97, 76, 13, 27, 49};  
  55.     MergeSort(L);  
  56.     copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));  
  57.     std::cout << std::endl;  
  58.     return 0;  
  59. }  


输出:

 

    1. 13 27 38 49 49 65 76 97