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

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

你可能感兴趣的:(sort,算法导论,计数排序,Counting)