算法导论学习笔记——基数排序

/**
 * 基数排序:n个d位数进行排序,先从最低有效位进行,由于每位数字都界于0到9(只考虑整数),
 * 可以用计数排序对每一位进行排序,重复这一过程直到对所有的d位数字都进行了排序。
 * 由于计数排序的复杂度为O(n+k),所以基数排序的时间复杂度为O(d(n+k))
 */
public class RadixSort {

	/**
	 * 用计数排序将arr数组按第i位排序
	 * @param arr  要排序的数组
	 * @param i   第i位
	 */
	static void countingSort(int arr[],int i){
		//存放arr中每个元素第i位的值
		int a[] = new int[arr.length];
		//b数组存放arr中现在的值,把排序结果放在 arr数组中
		int b[] = new int[arr.length];
		//c存储从0到9每个元素在a中出现的次数,故c的长度为10。
		int c[] = new int[10];
		//把arr中的元素放到b数组中
		for(int j = 0;j<arr.length;j++){
			b[j] = arr[j];
		}
		//计算每个元素第i位的值,然后放入a数组中
		for(int j = 0;j<b.length;j++){
			int temp = (int)Math.pow(10, i);
			int r =  b[j]%temp;
			if(i>1){
				int x = (int)Math.pow(10, (i-1));
				r=r/x;
			}
			a[j]=r;		
		}
		//c[j]中存放了等于j的元素的个数
		for(int j = 0;j<a.length;j++){
			c[a[j]]++;
		}
		//c[j]存放小于或等于j的元素个数
		for(int j = 1;j<10;j++){
			c[j]+=c[j-1];
		}
		//由于c[r]存放小于等于r的元素个数(r=a[j]),所以r应该放在arr数组中的c[r]位置(由于数组从0开始,所以要减1)
		for(int j = a.length-1;j>=0;j--){
			int r = a[j];
			arr[c[r]-1] = b[j];
			//每次c[r]减1可以保证下一个等于r的相同元素,落在arr[c[r]-1]的前一个位置
			c[r]--;
		}
	}
	/**
	 * 外层排序算法,从最低有效位到d有效位,逐位进行排序
	 * @param arr  数组
	 * @param d  d代表 每个数是几位数
	 */
	static void radixSort(int arr[],int d){
		for(int i = 1;i<=d;i++)
			countingSort(arr,i);
	}
	//测试.....
	public static void main(String args[]){
		int arr[] = {329,457,657,839,436,720,355};
		radixSort(arr,3);
		for(int i = 0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值