算法数据结构C++实现4-计数排序(counting sort)

来源:互联网 发布:linux 发送邮件日志 编辑:程序博客网 时间:2024/05/29 10:09

这里是 Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort, 本专题还是以这本书为主,用c++实现其中最重要的算法。

网上也有很多高手研究了这本书,给出了读书摘要;但是先要深入学习这本书的话,还是需要自己去看书的。 本专题的特色就是直接给出程序实现;

这本书的算法还是非常简明易懂的,就是算法分析和一些数学问题会比较难,这些内容还是需要有时间自己慢慢研究的,不过有些比较深入的内容的话,工作中用的会比较少,所以这里主要实现其中的算法。

下面是计数排序 counting sort 的全部代码。

时间效率很高,但是需要额外空间O(n);其实也可以使用等于关键字数个额外空间,节省很多空间的。那个复杂很多,有空我贴上来。

#include<iostream>#include<vector>#include<algorithm>using namespace std;void countingSort(vector<int> &ib, vector<int> &ia, int maxEle){vector<int> ic;//new vector<int>[11]; 这里用new会出现下标溢出的错误!!!int i = 0;ic.resize(maxEle+1,0);//注意这是正确的单个vector分配空间的正确用法!!!for(auto x:ia){ic[x]++;}for(i=1; i<=maxEle; i++){ic[i]=ic[i]+ic[i-1];}for(i=ia.size()-1; i>=0; i--){ib[ic[ia[i]]-1]=ia[i];ic[ia[i]]--;}}void countingSort(vector<int> &ia, int maxEle){vector<int> ib(ia);countingSort(ia,ib,maxEle);}template<typename T>class Print{public:Print(){}void inline operator()(const T& x) const{cout<<x<<" ";}};//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。int main()try{{int a[4]={5,2,9,8}; vector<int> vecI1(a,a+4);vector<int> vecI11(4);int b[7]={2,10,7,10,9,4,5};vector<int> vecI2(b,b+7);vector<int> vecI22(7);countingSort(vecI1,9);countingSort(vecI2,10);for(auto x:vecI1){//C++11标准遍历数组,非常方便cout<<x<<" ";}cout<<endl;for_each(vecI2.begin(), vecI2.end(), Print<int>());cout<<endl;//这里利用stl中的函数实现输出return 0;}}catch(out_of_range){cerr<<"range error\n";}catch(...){cerr<<"unknow exception thrown\n";}

重点还是要注意下标的问题,和vector的用法,vector分配内存问题。算法并不难实现。