基数排序C++实现

基数排序介绍

基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。
具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序图文说明

基数排序图文说明

通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:

基数排序C++实现_第1张图片

在上图中,首先将所有待比较树脂统一为统一位数长度,接着从最低位开始,依次进行排序。
1. 按照个位数进行排序。
2. 按照十位数进行排序。
3. 按照百位数进行排序。
排序后,数列就变成了一个有序序列。

为什么要从个数开始比较,低位是有序的,高位中如果有相同的值,则只需在保持稳定的前提下对高位进行排序,结果自然有序。

基数排序代码

//radix sort
//基数排序也是基于一种假设,假设所有数都是非负的整数
//基数排序的基本思路是从低位至高位依次比较每个数的对应位,并排序;对应位的比较采用计数排序也可以采用桶排序;
//基数排序是一种稳定的排序方法,不稳定的话也没法排序,因为某一位相同并不代表两个数相同;


#include
#include

using namespace std;

void countSort(vector& vec,int exp)
{//计数排序
	vector range(10,0);

	int length=vec.size();
	vector tmpVec(length,0);

	for(int i=0;i=0;--i)
	{
		tmpVec[range[(vec[i]/exp)%10]-1]=vec[i];
		range[(vec[i]/exp)%10]--;
	}
	vec=tmpVec;
}

void radixSort(vector& vec)
{
	int length=vec.size();
	int max=-1;
	for(int i=0;imax)
			max=vec[i];
	}
	
	//提取每一位并进行比较,位数不足的高位补0
	for(int exp=1;max/exp>0;exp*=10)
		countSort(vec,exp);
}

int main()
{
	int a[10]={53,3,542,748,14,214,154,63,616,589};

	vector vec(a,a+10);
	radixSort(vec);

	for(int i=0;i



radixSort(a, n)的作用是对数组a进行排序。
1. 首先获取最大值,目的是计算出数组a的最大指数。获取到数组a中的最大指数之后,再从指数1开始,根据位数对数组a中的元素进行排序。排序的时候采用了计数排序。

2.countSort(vec, exp)的作用是对数组a按照指数exp进行排序。

下面简单介绍一下对数组{53, 3, 542, 748, 14, 214, 154, 63, 616}按个位数进行排序的流程。

       a、个位的数值范围是[0,10)。因此,参见数组ranges,range[i]代表i之前的数据出现次数,也即当前数本应该在的位置。

      b、 接着是根据数组range来进行排序。假设将排序后的数组存在tmpVec中;找出tmpVec和range之间的联系就可以对数据进行排序了

参考文章:http://blog.csdn.net/coslay/article/details/47806035

你可能感兴趣的:(C/C++,排序算法合集)