数组排序之基数排序(图文+代码注释)

基数排序

对关键字进行“分配”与“收集”两种操作即可完成。
基数排序原理(图文解说):
{15,12,23,32,29,25,18,17,21,22}
首先,将数组中的元素个位与方框中的数字对应,将数组元素依次的根据个位放在方框中,然后再依次取出,如下图示一与图示二。**第一轮是取个位上的数字。**图示一:
1
现在进行第二步,依次将方框中的数依次取出。如图十二所示:
2
第二轮是看十位上,十位上是哪一个数我们就将这个数放在相应的方框中,如果十位上没有数,那么就放在0方框中。如下图所示:
首先我们先拿到刚刚初步排序好的那组数据,如下图:
3
然后依次将数组中的元素放进相应的方框中,根据十位来选择方框。如下图所示:
4

然后再从方框中依次的取出所有元素。如下图所示:
5
在排序中需要注意的是,数组中的最大数有多少位就需要多少轮比较。例如上图中的比较,因为最大数只有两位,所以进行了两轮比较。比较后得到有序的排列组合。
代码图示:
1
2
源码+注释展示:

//基数排序:通过数组元素最大的多少来确定排序的轮数,利用分配再收集的方式进行排序
	public static void main(String[] args) {
		int[] arr = {15,12,23,32,29,25,18,17,21,22,33,26,25,35};
		//获取数组中的最大值
//		int max = getMax(arr); //找出数组元素中的最大值
		//基数排序
		sortArray(arr);//调用基数排序的方法
		System.out.println(Arrays.toString(arr));//输出排序后的数组
	}

	private static void sortArray(int[] arr) {//定义基数排序的方法
		//定义图示中临时存放数组元素的十个位置
		int[][] tempArray = new int[10][arr.length];//10表示的是临时存放数组元素的十个位置,后面arr.length表示的是放如临时存储数组中的元素个数
		int[] counts= new int[10];//定义统计数组
		int max = getMax(arr);
		int len = String.valueOf(max).length();//将最大值传进去,计算最大值的长度,确定了轮次
		//循环轮次
		for (int i = 0,n = 1; i < arr.length; i++,n*=10) {
			for (int j = 0; j < arr.length; j++) {
				//获取每个位上面的数字,放入对应的临时存储区
				int wei = arr[j]/n%10;//n是位上面变化的值
				tempArray[wei][counts[wei]++]=arr[j];//在这个临时数组中,二维表示的是位与该数出现的次数
			}
			//取出临时区中存放的数组
			int index = 0;
			for (int k = 0; k < counts.length; k++) {
				if (counts[k]!=0) {
					for (int h = 0; h < counts[k]; h++) {
						//从临时存放区取出元素,放回原数组的容器中
						arr[index] = tempArray[k][h];
						index++;
					}
					counts[k] = 0;//清除上一次统计的元素
				}
			}
		}
	}

	private static int getMax(int[] arr) {//定义获取最大值的方法,返回一个最值,确定它有多少位
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (arr[i]>max) {
				
			}
		}
		return max;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值