NOIP--算法数据结构C++实现4-计数排序(counting sort)
Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort
下面是计数排序 counting sort 的全部代码。
时间效率很高,但是需要额外空间O(n);其实也可以使用等于关键字数个额外空间,节省很多空间的。
[cpp]
-
#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分配内存问题。算法并不难实现。
NOIP信息学视频地址
视频地址
链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw
提取码:7jgr