这里是 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分配内存问题。算法并不难实现。