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数组中。
    }

  • 相关阅读:
    cf-779E (拆位)
    石子游戏 (SG函数)
    [POI2017] Flappy Bird (思维题)
    Alice and Bob (SG函数)
    Red is good (DP)
    CodeVS-1669 (背包问题)
    GalaxyOJ-468 (LCA)
    BZOJ-1191 (二分图匹配)
    Reinforcement Learning 笔记(4)
    Reinforcement Learning 笔记(3)
  • 原文地址:https://www.cnblogs.com/wanggary/p/2041630.html
Copyright © 2011-2022 走看看