基数排序

理类似桶排序,这里总是需要10个桶,多次使用

首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数

例如

待排序数组[62,14,59,88,16]简单点五个数字

分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样

|  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 |

|  0  |  1  |  2  |  3  |  4 |  5  |  6  |  7  |  8  |  9  |桶编号

将桶里的数字顺序取出来,

输出结果:[62,14,16,88,59]

再次入桶,不过这次以十位数的数字为准,进入相应的桶,变成下边这样:

由于前边做了个位数的排序,所以当十位数相等时,个位数字是由小到大的顺序入桶的,就是说,入完桶还是有序

|  0  | 14,16 |  0  |  0  |  0  | 59 | 62  | 0  | 88  |  0  |

|  0  |  1      |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |桶编号


因为没有大过100的数字,没有百位数,所以到这排序完毕,顺序取出即可

最后输出结果:[14,16,59,62,88]

/**
 * 利用桶进行基数排序的方法
 * 1.首先对个位数进行桶排序,此时得到一个有序数列
 * 2.接下来对十位数进行桶排序,进桶的时候的顺序按照1中得到的有序数列的顺序
 * 3。下来对百位数进行桶排序,进桶的顺序按照2中得到的有序数列的顺序
 * 4.............................
 * 5.一直进行下去,直到提取所有数字的那一位是0
**/


/**
 * 基本算法
 * int weight = 1;
 * 1.取所有数字的第weight位,并将取到的数字放进一个数组中;
 * 2.按照weight位对所有的数字进行排序,利用桶排序;
 * 3.重复步骤1、2, 直到所有数字取出第weight位的数字为0
**/

#include <iostream>
#include <vector>
using namespace std;

/**
 * param arcArr:	待排数组
 * param length:	数组长度
 * param weightNum:	提取数字
 * param weight		提取第几位数
 * return			提取的数字全为0返回false,否则返回true
**/
bool choiceWeightNum(int srcArr[], int length, int weightNum[], int weight)
{
	int value = 1;
	for(int i=0; i<weight; i++)
	{
		value *= 10;
	}
	for(int i=0; i<length; i++)
	{
		weightNum[i] = srcArr[i]%value/(value/10);
	}
	for(int i=0; i<length; i++)
	{
		if(weightNum[i] != 0)
			return true;
	}
	return false;
}


/**
 * param arcArr:	待排数组
 * param length:	数组长度
 * param weightNum:	提取数字
**/
void sortByWeightNum(int src[], int length, int weightNum[])
{
	vector<vector<int> > bucket(10);	//因为一个桶里可能含有多个数字,因此采用二维数组
	for(int i=0; i<length; i++)
	{
		bucket.at(weightNum[i]).push_back(src[i]);		//将第i个数字按照第weight位放入桶中
	}
	int n = 0;
	for(int i=0; i<10; i++)
		for(int j=0; j<bucket[i].size(); j++)
			src[n++] = bucket[i][j]; 
}

void cordinalSort(int src[], int length)
{
	int *weightNum = new int[length];
	int weight = 1;
	if(weightNum == NULL)
	{
		cout << "数组分配失败" << endl;
		return;
	}
	while(choiceWeightNum(src, length, weightNum, weight))
	{
		sortByWeightNum(src, length, weightNum);
		weight++;
	}
	delete[] weightNum;
}

int main()
{
	int num[5] = {12, 104, 13, 7, 9};
	cordinalSort(num, 5);
	for(int i=0; i<5; i++)
		cout << num[i] << ' ';
	cout << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值