算法导论-排序(四)计数排序(线性时间排序)
2014-09-27 21:01
218 查看
目录
1、计数排序介绍
2、流程图
3、代码实现
4、性能分析
5、参考资料
内容
1、计数排序介绍
什么是计数排序?计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn); 而计数排序不需要对数进行比较就可以进行排序;很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)。。哈哈,那么神奇,下面开讲!!!!
限制:计数排序只能对非负整数(0,1,2,3...N)进行排序
排序思想:计数排序的基本思想就是对每一个输入元素 x,确定出小于 x 的元素个数。有了这一信息,就可以把 x 直接放到它在最终输出数组中的位置上。例如:有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。
2、流程图
排序算法步骤:1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项
2)累加元素出现次数(计算不超过 X包括X 的元素的个数)
3) 将元素X依次放入到适当的位置
排序伪码:
CountSort(A,n,k) //A-待排序数组;n-排序数组元素个数;k-大于等于待排序数组元素最大值的某个整数
步骤一流程图 1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项
步骤二 流程图 2)累加元素出现次数(计算不超过 X包括X 的元素的个数)
步骤三流程图 3)将元素X依次放入到适当的位置
3、代码实现(c++)
#include <iostream> #include <vector> #include <time.h> using namespace std; #define N 10 //排序数组大小 #define K 100 //排序数组范围0~K void CountSort(vector<int> &A) { //找出待排序数组最大、最小值 int min,max; min=max=A[0]; for (int i=1;i<A.size();i++) { if (A[i]<min) min=A[i]; else if (A[i]>max) max=A[i]; } //定义数组B存放排好的数 vector<int> B(A.size()); //定义数组C,大小为(max-min+1),C[i]为A中值为i的个数 vector<int> C(max-min+1); for (int i=0;i<max-min+1;i++) C[i]=0;//初始为0 for(int i=0;i<A.size();i++) C[A[i]-min]++;//计数 for (int i=1;i<max-min+1;i++) C[i]+=C[i-1];//累加 for (int i=A.size()-1;i>=0;i--) { B[C[A[i]-min]-1]=A[i];//A中值倒序取出放到B中合适位置,并在C计数中减1 //因数组下标从0开始,所以减1 C[A[i]-min]--; } A.assign(B.begin(),B.end());//B赋给A } ////打印数组 void print_element(vector<int> A) { int len=A.size(); for (int i=0;i<len;i++) { std::cout<<A[i]<<" "; } std::cout<<std::endl; } // 随机参数排序数组,产生数组范围0~k的整数 void Random(vector<int> &a,int n,int k) { int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a[i++]=rand()%k; } } int main() { vector<int > vec_int(N); Random(vec_int,N,K); cout<<"源数组: "; print_element(vec_int); CountSort(vec_int); cout<<"以排序数组: "; print_element(vec_int); system("PAUSE"); return 0; }
4、性能分析
分析性能好的快速排序和本节介绍的计数排序的效率【排序数组取值为0~100的整数,数组大小分别取100,1000,10000,100000测试】数组大小N | 快速排序(ms) | 计数排序(ms) |
100 | 0.153012 | 0.236982 |
1000 | 6.00759 | 4.61228 |
10000 | 58.4422 | 16.0187 |
100000 | 4176.58 | 169.768 |
注意:当排序数组元素个数较少时效率会降低,并且数组范围较大时内存消耗会[b]相对增多。[/b]
何时使用计数排序:
结: 1)待排序数组为非负整数
2) and 数组范围小,元素个数较多
5、参考资料
【1】http://blog.csdn.net/xyd0512/article/details/8261816【2】/article/4809945.html
【3】/article/6125622.html
相关文章推荐
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 算法导论-- 线性时间排序(计数排序、基数排序、桶排序)
- 五 线性时间排序(基数排序、计数排序和桶排序)
- 《算法导论》学习总结 — 8.第八章(2) 计数排序 && 基数排序 && 桶排序
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 算法导论 第8章 线性时间排序-计数排序的原址排序
- 算法导论,习题8-2,计数排序原址排序
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- 算法导论第八章计数排序-基数排序-桶排序-c++
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 算法导论(3) 快速排序、计数排序、基数排序
- 算法导论:第8章 线性时间排序__计数排序
- 排序——计数排序
- [排序] 计数排序
- 算法导论第六章堆排序相关代码
- 跟着《算法导论》学习——快速排序
- 算法导论CLRS 2.3 合并排序