排序算法之基数排序

基数排序是一种非比较型排序算法。它是通过依次对一个数的每一位来排序,最终来达到排序的目的。

比如数:73,22,93,43,55,14,28,65,39,81

对最低位排序后为:81,22,73,93,14,55,65,28,39

再对十位排序后:14 22 28 39 43  55 65 73 81 91

假设要排序的数中最大的数有d位,那么排序方法为

RADIX-SORT(A, d)
for i←1 to d
	do use a stable sort to sort array A on digit i 

算法导论中讲到的“stable sort”的做法是“箱子”,10进制数要有10个箱子,放进去时,从下往上,依次来放,取出来时,从底往上依次来取。

#include<iostream>
#include <vector>
using namespace std;
void RADIX_SORT(int A[], int d)
{
	//A,存放数的数组,d数组中最大数的位数
	int MaxW=1;
	for(int i=1;i<d;i++)
		MaxW=MaxW*10;
	vector<vector<int>> Tmp(10);//用做箱
	int n=1,lsd,k=0;//n,数组中,数的最大位数,lsd数的某一位大小,
	while (n<=MaxW)
	{
		for (int i=0;i<d;i++)
		{
			lsd=(A[i]/n)%10;//求某一位数
			Tmp[lsd].push_back(A[i]);
		}
		for (int i=0;i<10;i++)
		{
			if (!Tmp[i].empty())
			{
				for (vector<int>::iterator iter=Tmp[i].begin();iter!=Tmp[i].end();iter++)
				{
					A[k]=*iter;
					k++;
				}
				Tmp[i].clear();//清空
			}
		}
		n=n*10;
		k=0;
	}


}
int main()
{
	int A[10]={73,22,93,43,55,14,28,65,39,81};
	RADIX_SORT(A, 2);
	for(int i=0;i<10;i++)
		cout<<A[i]<<" ";
}


你可能感兴趣的:(排序算法之基数排序)