常用排序算法(十)——基数排序

        基数排序又是一种和前面排序方式不同的排序方式,基数排序不需要进行记录关键字之间的比较。基数排序是一种借助多关键字排序思想对单逻辑关键字进行排序的方法。所谓的多关键字排序就是有多个优先级不同的关键字。比如说成绩的排序,如果两个人总分相同,则语文高的排在前面,语文成绩也相同则数学高的排在前面。。。如果对数字进行排序,那么个位、十位、百位就是不同优先级的关键字,如果要进行升序排序,那么个位、十位、百位优先级一次增加。基数排序是通过多次的收分配和收集来实现的,关键字优先级低的先进行分配和收集。

        举个栗子:
图片描述

图片描述

       实现代码:

public class RadixSort { 
	public static void radixSort(int[] arr) { 
		if(arr == null & arr.length == 0) 
			return ; 
		
		int maxBit = getMaxBit(arr); 
		
		for(int i=1; i) { 
			List> buf = distribute(arr, i); //分配 
			collecte(arr, buf); //收集 
		} 
	} 
	
	/** 
	* 分配 
	* @param arr 待分配数组 
	* @param iBit 要分配第几位 
	* @return 
	*/ 
	public static List> distribute(int[] arr, int iBit) { 
		List> buf = new ArrayList>(); 
		
		for(int j=0; j) { 
			buf.add(new LinkedList()); 
		} 
		
		for(int i=0; i) { 
			buf.get(getNBit(arr[i], iBit)).add(arr[i]); 
		} 
		
		return buf; 
	} 
			
	/** 
	* 收集 
	* @param arr 把分配的数据收集到arr中 
	* @param buf 
	*/ 
	public static void collecte(int[] arr, List> buf) { 
		int k = 0; 
		for(List bucket : buf) { 
			for(int ele : bucket) { 
				arr[k++] = ele; 
			} 
		} 
	} 
	
	/** 
	* 获取最大位数 
	* @param x 
	* @return 
	*/ 
	public static int getMaxBit(int[] arr) { 
		int max = Integer.MIN_VALUE; 
		for(int ele : arr) { 
			int len = (ele+"").length(); 
			if(len > max) 
				max = len; 
		} 
		return max; 
	} 
	
	/** 
	* 获取x的第n位,如果没有则为0. 
	* @param x 
	* @param n 
	* @return 
	*/ 
	public static int getNBit(int x, int n) { 
		
		String sx = x + ""; 
		if(sx.length() n) 
			return 0; 
		else 
			return sx.charAt(sx.length()-n) - '0'; 
	} 
}

转载于:https://my.oschina.net/u/1587469/blog/725117

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值