基数排序算法

本文深入探讨了基数排序的原理,通过一个实例详细解析了如何获取最大数的位数,以及如何进行位数遍历、计数、前缀和计算和数组重排。文章还提供了Java代码实现,展示了基数排序的完整过程,帮助读者理解这种非比较型整数排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 我们获取到最大的数的位数
  2. 遍历每个数的某一位的(个位或者十位等)位数,将该位数的数字放入一个数组计数器中,计算该数出现了多少次,每个位置上的数字就代表了该数字出现了几次,比如2位置上的数为1,代表2出现了依次,然后求该数组的前缀和,前缀和就是i位置上的数是前面所有位置上的数的和加上自己位置上的数,举个例子,如图:
    在这里插入图片描述
    在求完前缀和过后,我们数组中的数就变成了小于等于i的数出现了几次。
  3. 将我们的数放入帮助数组之中,放在哪个位置,首先倒着遍历原来的数组,为什么要倒着,等一下解释,先看如何放,每当遍历到一个数过后获取它的那一位的数(个位或者十位等),获取到这个数过后,取我们之前创建的存放前缀和的数组找出它这个位置对应的数,如果这个数为2那么代表在这一位上小于等于该数的数量是2个,那么将该数的真正的数存放在帮助数组的位数减一的位置,可能有点难以理解,看图:在这里插入图片描述
    下面我们来解释为什么每次都需要倒序寻找数组,如果我们正序循环数组,当寻找个位时候并不会出错,但是当我们寻找十位上的数的时候,升序放入数组的话,我们放入结果数组的时候是从后面开始放着走的,那么会出现数字放反的情况,因为我们的前缀和只知道小于等于它的数的总数,也就是说只知道末位置,并不知道首位置(当然你也可以自己求,但是没必要又去算一次)。如图:
    在这里插入图片描述
//求某一个数科学计数法是10的几次方
	public static int maxBits(int arr[]){
		int max=Integer.MIN_VALUE;
		for(int i=0;i<arr.length;i++){
			max= max<arr[i]?arr[i]:max;
		}
		int res=1;
		while(max>=10){
			max/=10;
			res++;
		}
		return res;
	}
	public static void RadixSort(int arr[],int left,int right,int digit){
		int length=right-left+1;
		int arrHelp[]=new int[length];
		for(int i=0;i<digit;i++){//又多少位遍历多少次
			int[] nums=new int[10];//数组 用于装  每个数有多少个
			for(int j=left;j<=right;j++){//遍历每个数获取它第i位的数字
				int k=getNum(arr[j],i);
				nums[k]++;
			}
			for(int j=1;j<10;j++){//求前缀和  让数组i位置下的数字的意义就变为了 小于等于i的个数
				nums[j]=nums[j]+nums[j-1];
			}
			for(int j=right;j>=left;j--){//从后往前将数字放入帮助数组中 因为我们排好序过后是从小到大的 我们放数据的时候是从最后一位开始放的 所以我们会从后往前遍历数组 先放大的
				int k=getNum(arr[j],i);
				arrHelp[nums[k]-1]=arr[j];
				nums[k]--;
			}
			for(int j=left,k=0;j<=right;j++,k++){//将拍好顺序的数组放回arr中 因为我们的arrHelp下次还要使用
				arr[j]=arrHelp[k];
			}
		}
	}
	
	public static int getNum(int num,int index){//返回某个数第几位的数字 如果超过自己的位数了直接为0
		return (num/((int)Math.pow(10, index)))%10;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值