排序算法大全之基数排序

排序算法大全之——基数排序

基数排序是一种分配式排序,又成为桶子法排序

LSD(我们以最低位优先)

第一步:假设原有一串数字如下:

   2345123243

   遍历这些数的个位数字,将他们分别装进编号为09的桶中

   桶  0:为空,因为这些数中没有个位数为0

   桶  1:空

   桶  21232

   桶  32343

   桶  4:空

   桶  545

   桶  6:空

   桶  7:空

   桶  8:空

   桶  9:空

第二步

   接下来将这些桶中的数据依次串起来,排成一排:

   1232234345

   接下来,再进行一次分配,这次以十位数字来分

   

   桶  0:空

   桶  112

   桶  223

   桶  332

   桶  44345

   桶  5:空

   桶  6:空

   桶  7:空

   桶  8:空

   桶  9:空

第三步:桶中的数据在依次按照09桶的顺序串起来

得到:1223324345

 

LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。


package com.wukung.blog;

/**
 * @author WuKung
 * @csdnURL http://blog.csdn.net/wu_kung/
 * @createdDate 2014-5-3 下午11:15:40
 */
public class LSDTest {

	/**
	 * 对一群两位数进行基数排序
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = {23,45,12,32};
		LSD(a,2);
		for(int i=0;i<a.length;i++){
			System.out.print(" "+a[i]);
		}
	}

	public static void LSD(int[] data,int d){
		int k=0;
		int n=1;
		int m=1;
		
		int[][] temp = new int[10][data.length];
		int[] order = new int[10];
		
		while(m<=d){
			for(int i=0;i<data.length;i++){
				
				int lsd = (data[i]/n)%10;
				temp[lsd][order[lsd]] = data[i];
				order[lsd]++;
			}
			
			for(int i=0;i<10;i++){
				
				if(order[i]!=0){
					for(int j=0;j<order[i];j++){
						data[k]=temp[i][j];
						k++;
					}
					//这一步骤容易遗忘,记得请0,为外层循环的下一步做准备
					order[i]=0;
				}
				
			}
			k=0;
			n=n*10;
			m++;
		}
		
		
		
	}
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值