排序算法大全之——基数排序
基数排序是一种分配式排序,又成为桶子法排序
LSD(我们以最低位优先)
第一步:假设原有一串数字如下:
23,45,12,32,43
遍历这些数的个位数字,将他们分别装进编号为0到9的桶中
桶 0:为空,因为这些数中没有个位数为0的
桶 1:空
桶 2:12,32
桶 3:23,43
桶 4:空
桶 5:45
桶 6:空
桶 7:空
桶 8:空
桶 9:空
第二步
接下来将这些桶中的数据依次串起来,排成一排:
12,32,23,43,45
接下来,再进行一次分配,这次以十位数字来分
桶 0:空
桶 1:12
桶 2:23
桶 3:32
桶 4:43,45
桶 5:空
桶 6:空
桶 7:空
桶 8:空
桶 9:空
第三步:桶中的数据在依次按照0到9桶的顺序串起来
得到:12,23,32,43,45
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++;
}
}
}