首页 > 其他 > 详细

排序算法大全之基数排序

时间:2014-05-10 09:12:29      阅读:419      评论:0      收藏:0      [点我收藏+]

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

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

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++;
		}
		
		
		
	}
	
}



排序算法大全之基数排序,布布扣,bubuko.com

排序算法大全之基数排序

原文:http://blog.csdn.net/wu_kung/article/details/25001073

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!