排序算法之基数排序

思路:基数排序是一种不用通过数的比较的一种排序方法。将要排序的元素分配至某些“桶”中。先定义一个数组T有10个 分别代表0-9的数字的桶 ,假定现在数组A内容为 7,4,2,2,1,5,8(暂用个位数便于理解),6, 吧数组内容对应到桶中的0-9() ,有一个对应的值 桶数值+1;则对应后数组T中的数据为【0,1,2,0,1,1,0,1,1,0】在吧数组每个等于前面数组的和 结算后 数组T变为【0,1,3,3,4,4,5,6,7,7】。在把A数组内容,从后到前取出,把取出的值座位T数组的下标,取出数组T中的值 该值减一 作为下标 这A数组取出的值就存于新数组的该下标处。十位百位数时,有值取值,没值为0.(代码有详细注释帮助理解)

详细代码:

package rank;

public class BaseRank {// 基数排序
	public static void main(String[] args) {
		int[] array = { 15, 3, 7, 32, 18, 1, 9 };
		array = sort.sort(array);
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
	}
}

class sort {
	public static int[] sort(int[] array) {
		int[] pail = new int[10];
		int[] newArray = new int[array.length];
		int maxdigit = getMaxValueLength(array);// 获取最大的位数
		for (int base = 1; base <= maxdigit; base++) {// 根据位数进行主循环 默认个位数开始
			for (int i = 0; i < array.length; i++) {
				int digit = getDigit(array[i], base);
				pail[digit] = pail[digit] + 1;// 吧内容放到对应的桶中+1
			}
			for (int j = 1; j < 10; j++) {
				pail[j] = pail[j] + pail[j - 1];// 将桶中的数据进行增加 后面=本身+前面内容
			}
			for (int number = array.length - 1; number >= 0; number--) {
				int pailIndex = getDigit(array[number], base);// 取出数组最后一个数的位数值(个,十,百)

				newArray[pail[pailIndex] - 1] = array[number];// 吧pail数组中下标为pailIndex的值-1就是该值在新数组中的下标
				pail[pailIndex] = pail[pailIndex] - 1;// 下标对应值 取出后 值减一保证重复数字进来
			}
			for (int a = 0; a < array.length; a++) {// 吧内容放回 原先数组 ,避免再次循环报错
				array[a] = newArray[a];
			}
			pail = new int[10];// 初始化桶数组
		}
		return array;
	}

	// 获取数组中的最大值的位数
	private static int getMaxValueLength(int[] originList) {
		int max = originList[0];
		for (int i = 1; i < originList.length; i++) {
			if (originList[i] > max) {
				max = originList[i];
			}
		}
		return (max + "").length();
	}

	// 第一个参数为底数,第二个为 几次方
	public static int getDigit(int number, int base) {
		int baseNum = (int) Math.pow(10, (base - 1));
		return (number / baseNum) % 10;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值