八大排序算法之七:基数排序

算法思想
思想:

通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
=>将所有的待比较数值统一为同样的数位长度,数位较短的数前面补0。然后,从最低位开始,依次进行排序(每一位进行一次,一共有多少位,就进行多少次排序)。

基数排序的实现思路:
  1. 用于排序过程的“桶”

    • 假设用于排序的数均为正整数,那么在这里设置桶的个数为10。又因为每个桶,实际上也是一个一维数组。
      所以,定义一个二维数组,来实现排序过程中对于“桶”的要求:
      int[][] bucket = new int[10][arr.length];
    • 在每趟排序过程中,每个桶中存储的有效元素的个数,也是需要记录的。
      可以定义一个一位数组,来记录每个桶中所存储的有效元素的个数:
      int[] bucketElementCounts = new int[bucket.length];
  2. 确定对arr[]中的元素实现排序,一共需要进行排序的趟数:

    • 在基数排序中,需要进行的排序的趟数 == arr[]中最大的数 的位数
  3. 排序过程的实现:

    • 每趟排序过程主要分为两步:
      1)将元素依据 该趟排序所参照的数位 上的值,放入到对应的桶中
      2)按照放入桶中的顺序,从桶中依次取出对应元素的值,放回到arr[]中
算法实现
//实现基数排序
	public static void radixSort(int[] arr) {
		//定义一个二维数组,来实现排序过程中对于“桶”的要求
		int[][] bucket = new int[10][arr.length];
		//定义一个一位数组,来记录每个桶中所存储的有效元素的个数:
		int[] bucketElementCounts = new int[bucket.length];
		
		//确定对arr[]中的元素实现排序,一共需要进行排序的趟数
		//先找到arr[]中最大的数
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
			}
		}
		//确定最大的数的位数(巧妙)
		int maxLength = (max + "").length();
		
//		System.out.println("max="+max+",max.length="+maxLength);
		
		//排序过程的实现:
		int temp;//记录该数 在相应位上的值
		for (int i = 0,n = 1; i < maxLength; i++,n*=10) {//一共需要进行排序的趟数
			//在每趟排序中,需要先将元素依据 该趟排序所参照的数位 上的值,放入到对应的桶中
			for (int j = 0; j < arr.length; j++) {
				//获取该位上的值
				temp = arr[j] / n % 10;
//				System.out.println(temp);
				//将该值放入到相应桶中的相应位置
				bucket[temp][bucketElementCounts[temp]] = arr[j];
				bucketElementCounts[temp]++;//更新该值(记录的是下次放入该桶中的元素,应该在的存储位置的下标值)
			}
			//对应的arr[]中下标值
			int index = 0;
			//从桶中取出相应的值,并按照顺序放回到arr[]中去
			for (int k = 0; k < bucket.length; k++) {//对应第k个桶的情况
				if(bucketElementCounts[k] > 0) {//该桶中放置的有元素(桶不为空,才有从中读取元素的必要)
					for (int l = 0; l < bucketElementCounts[k]; l++) {
						arr[index] = bucket[k][l];
						index++;//更新该值(记录的是下次放入arr[]中的元素,应该在的存储位置的下标值)
					}
					//将bucketElementCounts[]中对应的值清0(对应的桶中存储的元素数目清0)
					bucketElementCounts[k] = 0;
				}
				//如果该桶中本来就没有元素,也不存在读出元素之后,进行置空的操作
			}
			
			
		}
	}

行百里者半九十!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值