基数排序(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • layui table样式_layui table 分页

    layui table样式_layui table 分页table的结构:       序号   登录账号   用户名   权限   操作          ${(user.id)!”}   ${(user.userAccount!”)}   ${(user.userName!”)}   ${(user.

    2022年9月16日
    3
  • vs2019安装和使用教程(详细)

    vs2019安装和使用教程(详细)本篇博客是vs2017安装和使用教程(详细)的姊妹篇vs2019已经在4月2日正式发布,vs2019发布会请看这个链接:vs2019发布活动vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F#,ios,Android,Web,Node.js,Azure,Unity,HTML,JavaScript等开发都可以执行,相关介绍可以看这个官方网址:Vi…

    2022年6月14日
    75
  • Hdu1396「建议收藏」

    Hdu1396「建议收藏」//CountingTriangles/*顶角朝上的三角形:a[i]=a[i-1]+c(i+1,2)(从底边任选两点为正三角形底边)顶角朝下的三角形:b[i]=b[i-1]+c((i+1)/2,2)+c((i+2)/2,2)(因为偶数边长的正三角形和其边长一半的反三角形存在着对应关系,所以将底边所有的点分为两类:奇数和偶数点;再在相应的奇数…

    2022年8月12日
    5
  • idea激活码2019破解方法[通俗易懂]

    idea激活码2019破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    269
  • 浅谈一下学Java和python哪个好(个人观点)「建议收藏」

    浅谈一下学Java和python哪个好(个人观点)「建议收藏」其实这是一篇容易引起撕逼的文章,java是一种覆盖范围广,可跨平台的编程语言,python也是近几年火遍全世界的语言。先说结论,java是基础,另外一个是加分项,我仅代表我个人观点,为了祖国和谐,人民安康,请各位看官尽量理性讨论。java和python哪个好?很多朋友碰到了一个很共性的问题,那就是编程语言的选择。虽然Python这两年确实很火,但如果你的学历不是硕士以上,数学能力也一般,就无脑选java,不要选择Python作为就业方向。单单只会Python这门语言的是找不到工作的!Pyth

    2022年7月9日
    24
  • 高清播放之滤镜 – MadVR「建议收藏」

    高清播放之滤镜 – MadVR「建议收藏」转自:https://liutao.xyz/highdefinition_madvr/为什么推荐madVR作为渲染器1、madVR可以实现更精确的颜色处理。madVR全程在16bit/32bit下进行运算,精度远高于EVR/VMR等8bit,并抖动到8bitRGB输出。madVR的高精度运算和轻微的抖动噪声有着掩盖色带色块等作用。如果片源是10bit,madVR搭配ffdshow

    2022年9月14日
    2

发表回复

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

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