算法8-基数排序算法

本文介绍了基数排序算法的工作原理,这是一种非比较型排序算法。通过设置10个桶进行数字分配,按照从低位到高位的顺序依次进行排序。首先处理个位,然后十位,最后百位,确保最终数组有序。提供的Java代码示例展示了如何实现基数排序,包括获取数字位数、计数排序等关键步骤。

基数排序算法思想:

基数排序算法属于不基于比较的排序算法中的一种,要根据具体的数据状况来判断能否采用基数排序算法进行排序。

假设基数为10,待排序数组arr中有N个数,最大数字为arr[i],有3位数字,则要把数组中长度不到3位的数字左边补0,使其变为3位数字。准10个桶,编号为0-9十个数字:
(1)从左到右遍历数组,先根据数组arr的元素的个位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中;
(2)从左到右遍历数组,再根据数组arr的元素的十位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中;
(3)从左到右遍历数组,最后根据数组arr的元素的百位数字,依次将数组元素放入对应编号的桶中(桶具有先入先出的特点),数组遍历完成之后,依次将编号0-9的桶中的数字倒出来,放入数组arr中,至此,数组从小到大排序完成。

(1)、(2)和(3)三个步骤,哪个步骤越靠后,该位数字排序的优先级越高,也就是说,对于本例而言,排序的时候先考虑百位数字的顺序,再考虑十位数字的顺序,最后考虑个位数字的顺序,这也符合我们数学上排序的习惯。

计数排序代码:

public class RadixSort {	
	public void radixSort(int[] arr){
		if(arr == null || arr.length < 2){
			return;
		}
		int digit = getDigit(arr);//获取数组中最大元素的位数
		final int radix = 10;//基数为10
		int[] bucket = new int[arr.length];//辅助数组
		for(int d = 1; d <= digit; d++){//d表示数组元素的从左到右第d位
			int[] count = new int[radix];//桶,count数组长度就是基数
			for(int i = 0;i < arr.length;i++){
				int figure = getFigure(arr[i],d);//取出arr[i]第d位上的数字
				count[figure]++;//计数桶,count[figure]表示第d位上为figure的数字有几个
			}
			for(int i = 1; i < count.length;i++){
				count[i] += count[i - 1];//count[i]表示第d位上小于等于i的数字有几个
			}
			for(int i = arr.length - 1;i >= 0;i--){//count数组的特点,以及桶先入先出的特点,决定了数组此处要从右到左遍历
				int figure = getFigure(arr[i],d);
				bucket[--count[figure]] = arr[i];
			}
			for(int i = 0;i < arr.length;i++){
				arr[i] = bucket[i];
			}
		}		
	}
	
	public int getDigit(int[] arr){
		int max = Integer.MIN_VALUE;
		for(int i = 0;i < arr.length;i++){
			max = Math.max(arr[i], max);
		}
		int digit = 0;
		while(max != 0){
			digit++;
			max /= 10;
		}
		return digit;
	}
	
	public int getFigure(int num,int d){
		return (num / (int)(Math.pow(10,d - 1)) % 10);
	}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值