这里是 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"; }