zoukankan      html  css  js  c++  java
  • (13)归并排序之一 2路归并排序递归形式

          归并排序(Merging Sort),是又一类不同的排序方法。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。时间复杂度为O(nlog2n)

    const int count = 9;
    // 2-路归并排序之递归形式
    void CMergingSort::Path2MergingSort(void)
    {
    int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
    MSort(L, L,
    1, count - 1);
    //打印排序结果。
    for (int i = 0; i < count; ++ i)
    {
    cout
    << L[i] << "\t";
    }
    cout
    << endl;
    }
    // 2-路归并排序递归形式之合并
    void CMergingSort::Merge(int SR[], int TR[], int i, int m, int n)
    {
    //将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
    int j = 0, k = 0;
    for (j = m + 1, k = i; i <= m && j <= n; ++k)
    {
    //将SR中记录由小到大地并入TR
    if (SR[i] <= SR[j])
    TR[k]
    = SR[i++];
    else
    TR[k]
    = SR[j++];
    }
    while (i <= m) TR[k++] = SR[i++];//将剩余的SR[i..m]复制到TR
    while (j <= n) TR[k++] = SR[j++];//将剩余的SR[j..n]复制到TR
    }

    // 2-路归并排序递归形式之递归
    void CMergingSort::MSort(int SR[], int TR1[], int s, int t)
    {
    //将SR[s..t]归并排序为TR1[s..t]
    if (s == t)
    TR1[s]
    = SR[s];
    else
    {
    int TR2[count] = {0};//问题对于数据量比较大的情况,会否占用过多的存储空间??
    int m = (s + t) / 2;//将SR[s..t]平分为SR[s..m]和SR[m+1..t]
    MSort(SR, TR2, s, m);//递归地将SR[s..m]归并为有序的TR2[s..m]
    MSort(SR, TR2, m + 1, t);//递归地将SR[m+1..t]归并为有序的TR2[m+1..t]
    Merge(TR2, TR1, s, m , t);//将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
    }
    }

          在MSort函数里,else语句的int TR2[count] = {0};会在递归调用时申请和原始数组大小一样的数组,因为只是简单的数组,所以会在当前函数结束时,自动释放内存。是否会占用过多的存储空间?还需要大量数据时,进行测试。

  • 相关阅读:
    Server.MapPath()
    正斜杠(/)与反斜杠(\)总结
    ASP.NET DridView 显示行号
    Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
    DataTable中Rows.RemoveAt(i)和Rows(i).Delete的区别
    字段与属性的区别
    VS 创建assemblyinfo项目信息文件
    GridView的RowDataBound事件 获取当前行的某个数据列
    ASPxHtmlEditor上传重命名的方法
    关于ModalPopup控件不能调用CS事件代码的问题
  • 原文地址:https://www.cnblogs.com/wanggary/p/2039492.html
Copyright © 2011-2022 走看看