基数排序

基数排序思路:首先按照个位的大小进行一次排序,十位的大小进行一次排序,知道所有的位数均遍历完成。代码中详细写出

初级菜鸟,如果问题望指出,多多沟通,有利于成长。

public class RadixSort {

	public static void main(String[] args) {
		int[] arr = new int[] { 111, 110, 22, 21, 7, 9, 1 };
		System.out.println("基数排序前为:");
		for (int t : arr) {
			System.out.print(t + " ");
		}
		System.out.println();
		// 3是数组中最长的数据的长度,也可以通过克隆一个arr数组,排序求出这个最长数组的长度,或者转换成字符串比较
		radixSort(arr, 3);
	}

	private static void radixSort(int[] arr, int d) {
		for (int i = 0; i < d; i++) {
			arr = countingSort(arr, i);
			// 打印
			print(arr, i + 1, d);
		}
	}

	// 排序
	private static int[] countingSort(int[] arr, int expIndex) {
		int k = 9;
		// 存放排序后的数组
		int[] arrSort = new int[arr.length];
		// 记录数组中0-9中每一位的个数
		int[] num = new int[10];
		// 取数组中每一位数是多少
		for (int i = 0; i < arr.length; i++) {
			int d = getBitData(arr[i], expIndex);
			num[d]++;
		}

		for (int i = 1; i <= k; i++) {
			/*
			 * c数组记录数组中0-9的个数,下面这句话的意思是:说不一定清楚举个例子
			 * 假如数组得到的数据是:1,3,1,0,0,0,0,1,0,1,末尾是0的个数1个,末尾是1的个数是3个, 末尾是2的个数为1等等,
			 */
			num[i] += num[i - 1];
			/*
			 * 得到的结果是:1,4,5,5,5,5,5,6,6,7 末尾小于等0的个数是1,末尾小于等2的个数是4等等
			 */
		}
		/*
		 * 找到数字排序后相应的位置:例如9,在数组b中的位置,c[9]=7,代表小于等与9的有7个包括9在内有七个,
		 * 所以9应该在数组的第七个位置,数组是从0开始的,在b中写出9对应的位置,已经排序好了一个数,c数组中小于等于9的自然就少了一个
		 */
		for (int i = arr.length - 1; i >= 0; i--) {
			int d = getBitData(arr[i], expIndex);
			arrSort[num[d] - 1] = arr[i];// C[d]-1 就代表小于等于元素d的元素个数,就是d在B的位置
			num[d]--;
		}
		return arrSort;
	}

	/*
	 * 获取数字指定位的数字 取各位直接取余10就可以了,取十位,先取整也就是去掉个位,再取余10 111:取个位 =111%10=1
	 * ,111取十位:111/10=11,11%10=1十位数字
	 */
	private static int getBitData(int data, int expIndex) {
		while (data != 0 && expIndex > 0) {
			data /= 10;
			expIndex--;
		}
		return data % 10;
	}

	// 打印
	static void print(int[] arr, int k, int d) {
		if (k == d)
			System.out.println("最终排序结果为:");
		else
			System.out.println("按第" + k + "位排序后,结果为:");
		for (int t : arr) {
			System.out.print(t + " ");
		}
		System.out.println();
	}

}


参考地址:http://www.acmerblog.com/radix-sorting-5601.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值