zoukankan      html  css  js  c++  java
  • 算法导论8.24习题解答(计数排序)

    CLRS 8.2-4 :在O(1)的时间内,回答出输入的整数中有多少个落在区间[a...b]内。给出的算法的预处理时间为O(n+k)

    算法思想:

    利用计数排序,由于在计数排序中有一个存储数值个数的临时存储区C[0...k],利用这个数组即可。

    #include <iostream>
    using namespace std;
    //通过改编计数排序而来,因为有些部分需要注释掉
    void counting_sort(int*&a, int length, int k, int*&b, int*&c);
    int main()
    {
      const int LEN =100;
      int*a =newint[LEN];
      for(int i =0; i < LEN; i++)
        a[i]
    = (i -50)*(i -50) +4;
      int* b =new int[LEN];
      const int k =2504;
      int* c =new int[k +1];
      counting_sort(a, LEN, k, b, c);
      //这里需要注释掉
      //for(int i = 0; i < LEN; i++)
      // cout<<b[i]<<endl;
      int m;
      int n;
      while(cin>>m>>n)
      {
        if(m >n)
          cout
    <<"区间输入不对"<<endl;
        else
        {
          if(n <0)
            cout
    <<"个数为"<<0<<endl;
          else if(m <=0&& n <= k)
            cout
    <<"个数为"<<c[n]<<endl;
          else if(n > k && m >0)
            cout
    <<"个数为"<<c[k] - c[m -1]<<endl;
          else if(n > k && m <=0)
            cout
    <<"个数为"<<c[k]<<endl;
          else
            cout
    <<"个数为"<<c[n] - c[m -1]<<endl;
        }
      }
      return 0;
    }
    void counting_sort(int*&a, int length, int k, int*&b, int*&c)
    {
      for(int i =0; i < k +1; i++)
        c[i]
    =0;
      for(int i =0; i < length; i++)
        c[a[i]]
    ++;
      for(int i =1; i < k +1; i++)
        c[i]
    = c[i] + c[i-1];
      //这里需注释,因为对c数组内的元素进行减减操作会使其改变
      /*for(int i = length - 1; i >= 0; i--)
      {
        b[c[a[i]] - 1] = a[i];
        c[a[i]]--;
      }
    */
    }

    PS:计数排序的总时间为O(k+n),在实践中,如果当k = O(n)时,我们常常采用计数排序,这时其运行时间为O(n)

    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    洛谷P1120信息奥赛一本通1442 小木棍
    洛谷P1378 油滴扩展
    洛谷P1156 垃圾陷阱
    mybatis-Plus 实践篇之逆向工程
    Interceptor的使用及探究
    mysql,oracle,sqlServer 元数据查询
    navicat premium15免费版安装说明(附工具)
    打印日志你真的会吗?
    线程基础知识-必知必会
    空间复杂度&时间复杂度
  • 原文地址:https://www.cnblogs.com/null00/p/2065073.html
Copyright © 2011-2022 走看看