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

          那么在递归形式的2-路归并排序中,会不停的申请容量为count的int数组,在递归调用中会占用大量的存储空间。为了节省存储空间的开销,可以考虑非递归的形式。

    // 归并排序之非递归
    void CMergingSort::MergeSort(void)
    {
    const int count = 9;
    int A[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
    int step = 1;
    int B[count] = {0};

    //决定趟数
    while (step < count)
    {
    MergePass(A, B, step, count);
    //#1
    step = 2 * step;
    MergePass(B, A, step, count);
    //作用1:和#1轮替执行,保证源数据是被部分归并过的;
    step = 2 * step;      //作用2:在归并完成后再调用一次,把最终归并结果copy到A数组中
    } //其实是调用了MergePass里最后的for循环。
    //打印排序结果。
    for (int i = 0; i < count; ++ i)
    {
    cout
    << A[i] << "\t";
    }
    cout
    << endl;
    }

    // 归并排序非递归之一趟归并
    void CMergingSort::MergePass(int C[], int D[], int step, int len)
    {
    //决定每一趟需要几次归并
    int i = 0;
    while (i <= len - 2 * step)//一组一组地进行归并(这两组是)
    {
    Merge(C, D, i, i
    + step - 1, i + 2 * step - 1);
    i
    += 2 * step;
    }
    if (i + step < len)//如果剩余元素够一组再进行一次归并
    Merge(C, D, i, i + step - 1, len - 1);
    else
    for (int j = i; j <= len - 1; j++)//作用1:如果元素不够一组那么直接把剩余元素copy到目标指针所指向的空间
    D[j] = C[j]; //作用2:一切元素都归并完成之后,把最终归并结果copy到A数组中。
    }

  • 相关阅读:
    004 RequestMappingHandlerMapping
    003 HandlerMapping
    002 环境配置
    001 springmvc概述
    011 使用AOP操作注解
    010 连接点信息
    009 通知类型
    一台服务器的IIS绑定多个域名
    程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.8.50313.46”
    通过ping 主机名,或者主机名对应的IP地址
  • 原文地址:https://www.cnblogs.com/wanggary/p/2041630.html
Copyright © 2011-2022 走看看