9.基数排序

基数排序思想是对序列中的每个元素从个位到最大值的最高位进行比较,不足位数的用0补足,当排序结束后,可得有序序列。

和计数排序有些类似,计数排序是对序列中的元素进行计数,而基数排序则是对每位上的数进行记录(实则是在排序),并且这两个排序均是没有发生比较的情况下完成的排序~~~~尤其觉得基数排序神奇。

在基数排序中,我们需要10个代表0-9的数组,用来保存该位出现0-9中的元素,可以把这10个数组看做桶。

无形中的比较:

例如:123和56

在基数排序中,从个位开始把数据进桶:

在开始时,由于123的个位3比56的个位6小,所以放置位置如下:

再对他们的十位上进行比较:

由于最大值的最高位到达百位,所以还需继续比较,而56不足3位,则用0补足

完成排序!

参考代码:

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<array>
#include<time.h>
using namespace std;
const int c_n = 10;
//10个桶,编号为0-9,从个位开始,按照每位上的大小进行排序
//不足的以0补
int cifang(int num) //求10的n次方
{
	if (num == 0)
		return 1;
	else if (num == 1)
		return 10;
	else
		return cifang(num - 1) * 10;
}
void radixSort(int *a)
{
	int max = 0;
	array<vector<int>, c_n>Bucket;  //桶
	for (int i = 0; i < c_n; i++)  //找到最大值,循环次数是最大数的位数
	{
		if (a[i] > max)
			max = a[i];
	}
	int temp = max;
	int len = 0;
	while (temp)  //最大值的位数,即循环次数
	{
		temp /= 10;
		len++;
	}
	int j;
	temp = 0;
	while (temp<len)
	{
		j = 0;
		for (int i = 0; i < c_n; i++)   
		{
			int c = cifang(temp);
			c = a[i] / c;
			Bucket[c % 10].push_back(a[i]);  //按照位上的值进桶
		}
		for (int i = 0; i < c_n; i++)
		{
			auto begin = Bucket[i].begin();
			auto end = Bucket[i].end();
			if (!Bucket[i].empty())
			{
				while (begin != end)
				{
					a[j++] = *begin;  //把数据写入序列
					end++;
				}
				while (!Bucket[i].empty())  //清除数据,重新插入
				{
					Bucket[i].pop_back();
				}
			}
		}
		temp++;
	}

}

void main()
{
	srand(time(NULL));
	int a[c_n];
	for (int i = 0; i < c_n;i++)
	{
		a[i] = rand() % 300;
	}
	radixSort(a);
	for (int i = 0; i < c_n; i++)
		cout << a[i] << "  ";
	cout << "\n";
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值