基数排序

基数排序有2中方式,最高位优先(MSD)和最低位优先(LSD)。下面以LSD为例。

个人总结的基数排序的算法思想如下:

基数排序维护一个队列,因为该队列是以最低位为基数来保存各个元素的,所以,我姑且叫它为基数队列(~~)。基数列的大小与待排的数组的大小相同。

首先从最低位开始,扫描待排数组,每遍历完一次就完成一次基数队列的建立。再用基数队列来更新原数组。循环此过程,循环的次数取决于原数组中最大的位数。

基数排序的具体过程如下图:

站在巨人的肩膀上,我自己写的一点伪码:

 

/***说明

利用数组f[n]来模拟队列来实现基数排序.
r[n]里面的最大数为多少位,外循环就进行多少趟.每趟进行n次比较..
r[n]:待排数组.有一个next域,用来表示它所指向的那个元素..
f[n]:模拟队列的数组,每趟模拟完后就用模拟出来的队列更新r[n]...有一个next域,用来标记某个队列的对头是否已经有所指向了...
	***/




/****
基数排序算法开始...
  ***/
for(int k=1;k<=r[n]中最大值得位数;k++)
{
	初始化r[n]的next域,都赋值为-1...
    初始化f[n]的next域,都赋值为-1...

	for(int i=0;i<n;i++)
	{
		int j = fenliweishu(r[i],k);//分离r[i]的第k位数出来...
		if(f[j].next == -1)//该趟的第一次建立虚拟队列,队头还没有指向任何东西...
		{
			f[j].next = r[i];//队头指向本次的r[i]...
		}
		else
		{
			int p = f[j].next;
			while(p!=-1)
			{
				int temp = p;//保存p
				p = r[p].next;//更新p
			}
			r[temp].next = r[i];
		}
	}//2.for-end...

	//对r[n]进行更新...
	for(i=0,j=0;i<n;i++)
	{
		p = f[i].next;
		while(p!=-1)
		{
			r[j] = r[p];//更新r[n]...
			p = r[p].next;
			j++;
		}
	}

}//wai_for-end



//分离位数功能
int fenliweishu(int a,int b);
{
	int j;
	switch(b)
	{
	case 1:
		x = (a%10)/1;
	case 2:
		x = (a%100)/10;
	case 3:
		x = (a%1000)/100;
	case 4:
		x = (a%10000)/1000;
	}
	return j;
}




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值