基数排序(LSD+MSD)详解

基数排序(LSD+MSD)详解一.计数排序二.基数排序

大家好,又见面了,我是你们的朋友全栈君。

基数排序

分为两类:

第一类:最低位优先法,简称LSD法:先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列;具体过程如下图所示:

初始数组序列为:15,25,105,78,34,21,32,41,按照个位数大小依次入桶;

基数排序(LSD+MSD)详解

将桶中数依次倒出,对于同一个桶中的数按先进先出顺序倒出,结果为:21,41,32,34,15,25,105,78,再按十位数大小依次入桶;

基数排序(LSD+MSD)详解

将桶中数依次倒出,结果为:105,15,21,25,32,34,41,78,再按百位上数大小依次入桶,没有百位的数则按百位为0入桶;

基数排序(LSD+MSD)详解

将桶中数倒出,结果为:15,21,25,32,34,41,78,105

Java实现代码如下:

public void radixSort(int[] A,int n){
		int max = A[0];
		for(int i = 1 ;i < n;i++){
			if(max < A[i])
				max = A[i];
		}
		double d = Math.pow(10, String.valueOf(max).length());
		
		int k = 1;
		int[][] t = new int[10][n];  //桶
		int[] num = new int[n];  //记录每个桶中存入数的个数
		while(k < d){
			for(int a : A){
				int m = (a / k) % 10;
				t[m][num[m]] = a;
				num[m]++;
			}
			int c = 0;
			for(int i = 0; i < n; i++){
				if(num[i] != 0){
					for(int j = 0;j < num[i];j++){
						A[c++] = t[i][j];
					}
				}
				num[i] = 0;
			}
			k = k * 10;
		}
		
	}

第二类:最高位优先法,简称MSD法:先从最高位开始排序,再逐个对各分组按次高位进行子排序,循环直到最低位。

仍以序列:15,25,105,78,34,21,32,41为例,从最高位百位依次入桶,只有105有百位,其他百位按0算;检测每个桶中的数据。当桶中的元素个数多于1个的时候,要对这个桶递归进行下一位的分组。

基数排序(LSD+MSD)详解

Java代码实现:

public class MSDSort {
	public int[] sort(int[] A, int n){
		int max = A[0];
		for(int i = 1 ;i < n;i++){
			if(max < A[i])
				max = A[i];
		}
		int maxL = String.valueOf(max).length();  //获取数组中最长元素长度
		
		int k = new Double(Math.pow(10, maxL - 1)).intValue();
		int[][] t = new int[10][n];  //桶
		int[] num = new int[n];      //记录每个桶中存入数的个数
		
		for(int a : A){              //按最高位入桶
			int m = (a / k) % 10;
			t[m][num[m]] = a;
			num[m]++;
		}
		int c = 0;
		for(int i = 0; i < n; i++){
			if(num[i] == 1){        //如果桶中只有一个数则直接取出
				A[c++] = t[i][0];
			}else if(num[i] > 1){   //如果桶中不止一个数,则另存如数组B递归
				int[] B = new int[num[i]]; 
				for(int j = 0;j < num[i];j++){
					B[j] = t[i][j];
					sort(B,num[i]);   //递归方法
				}
			}
		}
		return A;
	}
	public static void main(String[] args) {
		RadixSort r = new RadixSort();
		int[] A = {12,1,23,123,34};
		r.sort(A, A.length);
		for(int a : A){
			System.out.println(a);
		}

	}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133297.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux shell 进去 uefi,怎么进入EFI Shell及怎么为UEFI截图「建议收藏」

    linux shell 进去 uefi,怎么进入EFI Shell及怎么为UEFI截图「建议收藏」目前大多数主板都采用了UEFI代替了原始的BIOS,其功能与可玩性也大大的增强了。EFIShell功能相当强大。有些主板内建EFIShell,有些没有,但也可以将EFIShell放进U盘中加载EFIShell以达到同样的效果。EFIShell自带许多功能强大的应用软件。它本身就是一个小小的操作系统了。这里我提供华擎UEFI进入EFIShell的办法及对截图工具的简要说明。$v1z’…

    2022年7月24日
    30
  • Java设计模式之创建型:建造者模式

    Java设计模式之创建型:建造者模式

    2021年10月4日
    38
  • 论述人工智能,大数据,云计算之间的关系_物联网大数据人工智能的关系

    论述人工智能,大数据,云计算之间的关系_物联网大数据人工智能的关系1、云计算信息产业三大革命个人计算机革命、互联网革命和云计算革命。互联网革命:1990年,将终端计算设备连接起来,实现了信息的发布、检索和共享,极大提高了沟通和协作的效率。云计算革命:2006年,云计算的计算能力变成了一种公共服务,云计算通过集中供应、按需供应的模式,打破了时空限制,真正实现了信息化。三次革命让信息普及程度和社会生产效率得到了极大提升。云计算的应用,颠覆了信息产业从产品销售到服务输出的原有商业模式,极大加速了信息产业规模化、专业化、精细化、自主化的发展进程。云计算的概

    2022年9月1日
    2
  • mac idea2022.01永久激活【2021免费激活】

    (mac idea2022.01永久激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    1.3K
  • IT公司速查手册–IT公司红黑榜

    IT公司速查手册–IT公司红黑榜IT公司速查手册–IT公司红黑榜http://www.bewww.net/index.html今天看到bewww.net原来有红黑榜,好像以前上去的时候还没有这个的。找工作的兄弟们要多留个心眼了,可疑的公司要先上网上查下,防止受骗~~~~黑榜上有不少挺熟悉的公司,好像我还投过简历的也有~~~ 

    2022年7月16日
    13
  • 天才就是这样炼成的

    天才就是这样炼成的from 水木社区 天才就是这样炼成的——记菲尔兹奖获得者澳大利亚数学神童、陶哲轩作者:舒锋澳大利亚土生土长的华裔天才陶哲轩(TerrenceTao)于2006年年8月获得数学界的诺贝尔奖–菲尔兹奖(FieldsMedal)。国际数学会(IMU)每年在国际数学大会上颁菲尔兹奖给两至四名数学家,IMU表示,陶教授被颁这个殊荣,是因他对偏微分方程、组合数学、混合分析和堆垒素数论的杰出贡献。陶

    2022年5月8日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号