• 数据结构


    归并排序(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  
  • 相关阅读:
    继续学习:C语言关键字
    继续学习C:运算符
    C语言小程序(八)、统计字母个数
    C语言小程序(七)、石头剪刀布
    飞思卡尔总结
    [原]NYOJ-子串和44
    C++函数重载详解
    趣味Shell
    C语言小程序(六)、数组操作
    C语言小程序(五)、数组查询
  • 原文地址:https://www.cnblogs.com/fengyv/p/3793506.html
Copyright © 2020-2023  润新知