基数排序

基数排序是一种线性排序,分为distribute(分配)和collect(回收)两个阶段。

算法需要:长度为10的队列。

每一轮分配,按照radix(基数)分别进入相应队列

例如待排序列为14,22,41,32,25,65,57

第一趟分配按照个位入队列

则每个队列为:

0号:空

1号:41

2号:22,,32

3号:空

4号:14

5号:25,65

6号:空

7号:57

8号:空

9号:空

回收阶段,将队列中数据依次回收

回收后:41,22,32,14,25,65,57

第二趟分配按照十位分配

0号:空

1号:14

2号:22,,25

3号:32

4号:41

5号:57

6号:65

7号:空

8号:空

9号:空

再次回收即已全部排序:14,22,25,32,41,57,65

注意的是分配与回收的总趟数由待排序列中最大数的位数决定

以下为代码:

public static void radixSort(int []arr,int d)
	{
		int power=1;
		LinkedQueue[] digitQueue=new LinkedQueue[10];
		for(int i=0;i<10;i++)
			digitQueue[i]=new LinkedQueue();
		for(int i=0;i<d;i++)
		{
			distribute(arr,digitQueue,power);
			collect(digitQueue,arr);
			power*=10;
		}

	}
	private static void distribute(int[]arr,LinkedQueue[]digitQueue,int power)
	{
		for(int i=0;i<arr.length;i++)
		{
			digitQueue[arr[i]/power%10].push(arr[i]);
		}
	}
	private static void collect(LinkedQueue[]digitQueue,int[]arr)
	{
	int i=0;
		for(int digit=0;digit<10;digit++)
		{
			while(!digitQueue[digit].isEmpty())
			{
				arr[i]=(Integer)digitQueue[digit].pop();
				i++;	
			}
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值