zoukankan      html  css  js  c++  java
  • 排序之自底向上?自顶向下?--C++

    看着算法书有点懵T_T

    参照https://blog.csdn.net/u011197534/article/details/78368580

    自顶向下即是归并排序,参考我之前的归并排序,如图

     

    自底向上,就是两两归并、四四归并、88归并,如下图:

     书上的伪代码:

    /*
    输入:n个元素的数组A[1...n]
    输出:按非降序排列的数组A[1...n]
    t <- 1
    while t < n
        s <- t; t <- 2s; t <- 0
        while i+t <= n
            merge(A, i+1, i+s, i+t)
            i <- i+t
        end while
        if i+s < n then merge(A, i+1, i+s, n)
    end while
    */

    完整代码:

    void merge(int A[], int l, int mid, int r)
    {
    
        int help[r-l+1];  //辅助数组
        int i = 0;
        int lIndex = l;
        int rIndex = mid + 1;
        while(lIndex<=mid && rIndex<=r)
        {
            help[i++] = A[lIndex] < A[rIndex] ? A[lIndex++] : A[rIndex++];
        }
        while(lIndex<=mid)
        {
            help[i++] = A[lIndex++];
        }
        while(rIndex<=r)
        {
            help[i++] = A[rIndex++];
        }
        for(i = 0; i < r-l+1; i++)
        {
            A[l+i] = help[i];
        }
        
    }
    
    void downUpSort(int A[], int n)
    {
        int i = 1;
        while(i < n)  //for(int i=1; i<n; t = 2 * i)
        {
            int s = i;
            i = 2 * s;  //归并子数组序列扩大一倍
            int j = 0;
            //子区间归并
            while(i+j <= n)  //for(int j = 0; j < n-i; j = j+2*i)
            {
                merge(A, j, j+s-1, j+i-1);
                j = j+i;
            }
            if(j+s < n)
                merge(A, j, j+s-1, n-1);
        }
    }
    
    int main()
    {
        int A[9] = {5,4,8,2,9,3,1,6,7};
        cout << "before sort: ";
        for (int i = 0; i < 9; i++)
            cout << A[i] << " ";
        cout << endl;
        downUpSort(A, 9);
        cout << "after sort: ";
        for (int i = 0; i < 9; i++)
            cout << A[i] << " ";
        cout << endl;
    }

    结果如下:

  • 相关阅读:
    学习python第二天数据库day1
    学习python第一天总纲
    Mac 键盘快捷键
    报错 Filtered offsite request
    mysql 顺序问题
    implode 把数组 组成一个字符串
    TP view中跳转到某个控制器
    生成商品的唯一货号
    数组排序
    判断文件是否存在 删除文件
  • 原文地址:https://www.cnblogs.com/harbin-ho/p/12676984.html
Copyright © 2011-2022 走看看