• (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};会在递归调用时申请和原始数组大小一样的数组,因为只是简单的数组,所以会在当前函数结束时,自动释放内存。是否会占用过多的存储空间?还需要大量数据时,进行测试。

  • 相关阅读:
    python线程与进程手记
    3.08课·········switch case及if else嵌套(日期格式)
    3.07课·········if分支语句
    3.06课·········C#语言基础
    3.05课·········进制转换
    Oracle profile 使用技巧
    sys用户密码丢失找回密码的步骤和命令
    oracle帐号scott被锁定如何解锁
    SQL中哪些情况会引起全表扫描
    Oracle创建用户、角色、授权、建表
  • 原文地址:https://www.cnblogs.com/wanggary/p/2039492.html
Copyright © 2020-2023  润新知