算法导论8.2-4习题解答(计数排序)
2011-03-22 21:25
447 查看
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
<<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
- 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)
算法思想:
利用计数排序,由于在计数排序中有一个存储数值个数的临时存储区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
<<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
- 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)
相关文章推荐
- 算法导论6.1-2习题解答
- 算法导论10.1-6习题解答(用两个栈实现一个队列)
- 算法导论6.1-7习题解答
- Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答
- 算法导论6.2-5习题解答(堆排序)
- 算法导论9.2-3习题解答(寻找第i小的数)
- 算法导论14.1节习题解答
- 算法导论6.3-3习题解答
- 算法导论8-5习题解答(平均排序)
- 【通告】算法导论习题解答
- Introduction to Algorithms 算法导论 第4章 递归式 学习笔记及习题解答
- 算法导论8.3-4习题解答(基数排序)
- Introduction to Algorithms 算法导论 第3章 函数的增长 学习笔记及习题解答
- 算法导论12.1-3习题解答(非递归中序遍历)
- 算法导论7.1-4习题解答(快速排序)
- 算法导论10.1-6习题解答(用两个栈实现一个队列)
- 算法导论10.1-7习题解答(用两个队列实现一个栈)
- Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答
- 线性时间排序之计数排序(算法导论8.2)
- 算法导论2-4习题解答(合并排序算法)