算法导论8.2-4习题解答(计数排序)

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 = new int [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)

转载于:https://www.cnblogs.com/null00/archive/2011/03/22/2065073.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值