《算法导论》第8章基数排序Java实现

前面的计数排序是基数排序的基础,思想是按照多个关键字(桶)对元素进行多轮的计数排序

例如对三位数排序时,首先根据个位数进行计数排序,然后十位数,最后根据百分数,最后得到有序的序列

import java.util.Arrays;

//基数排序,以对三位数为例
public class RadixSort {

	public static void main(String[] args) {
         int arr[] = {421,240,115,532,305,430,889,776,225};
         System.out.println("数组为:");
         System.out.println(Arrays.toString(arr));
         arr = Radix_Sort(arr,3);
         System.out.println("排序后为:");
         System.out.println(Arrays.toString(arr));
	}
	
	
	//针对三位数,按每个元素的个位数,十位数,百位数大小分别进行一次计数排序,共三次
	//一个数字任何一位上的大小值为0-9,所以k表示0到9,计数数组C下标为0到9
	//对n个d位数进行基数排序
	public static int[] Radix_Sort(int[] A,int d) {
		 int[] B = new int[A.length];//结果数组
		 int[] C = new int[10];//计数数组,范围为每位上的取值范围0-9
		 
		 //一个十进制数m,它的个位数是m/1%10,十位数是m/10%10,百位数是m/100%10
		 for(int i=0;i<d;i++) {
			 int division = (int)Math.pow(10, i);//取个位::/1 十位:/10 百位:/100中的基本划分点
			 for(int j=0;j<A.length;j++) {
				 int num = A[j]/division%10;//取个位 十位 或百位上的数,每轮由此位置上的数大小进行计数排序
				 
				 C[num]=C[num]+1;//进行计数排序中计数数组的更新
			 }
			 
			 //计数排序中计数数组count的累加,保证稳定性
			 for(int m=1;m<C.length;m++) {
				 C[m]=C[m]+C[m-1];
			 }
			 
			 //计数排序中逆序遍历原数组A,根据累加后的数组count将A中每个元素正确填入result中正确的位置中
			 for(int j=A.length-1;j>=0;j--) {
				 int num = A[j]/division%10;
                 B[C[num]-1]=A[j];
                 C[num]=C[num]-1;
			 }
			 
			 //将数组A更新为数组B
			 for(int j=0;j<A.length;j++) {
				 A[j]=B[j];
			 }
			 //将数组C清零,进行下一轮的循环
			 for(int j=0;j<C.length;j++) {
				 C[j]=0;
			 }
		 }
		 return A;
	}
	
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值