排序算法大全之——基数排序
基数排序是一种分配式排序,又成为桶子法排序
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++; } } }
原文地址:http://blog.csdn.net/wu_kung/article/details/25001073