经典排序算法--基数排序
基本思想:
基数排序是另外一种比较有特色的排序方式,它不需要直接对元素进行相互比较,也不需要将元素相互交换,你需要做的就是对元素进行“分类”。它是怎么排序的呢?
基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:
(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)
例如现在我们要将下列一组数进行排序: {13,25,1111,232,4454,79,86,98,61,447};
1)先按照各位数字进行排序,排序后结果为{1111,61,232,13,4454,25,86,447,98,79}
2) 然后再按照十位进行排序,排序结果为{1111,13,25,232,447,4454,61,79,86,98}
3)然后按照百位进行排序,如果百位为空,则认为百位为0,排序结果为{13,25,61,79,86,98,1111,232,447,4454}
4)最后按照千位排序,排序结果为{13,25,61,79,86,98,232,447,1111,4454}
java代码实现:
1 public class BaseSort { 2 public static void main(String[] args) { 3 int[] a = {13,25,1111,232,4454,79,86,98,61,447}; 4 System.out.println("初始值:"); 5 print(a); 6 a=sort(a); 7 System.out.println("\n排序后:"); 8 print(a); 9 } 10 11 12 public static int[] sort(int[] data){ 13 int maxLength = getMaxLength(data); 14 int[] tmp = baseSort(data,0,maxLength); 15 return tmp; 16 } 17 18 /** 19 * @param data 20 * @param i 21 * @param maxLength 22 * @return 23 */ 24 private static int[] baseSort(int[] data, int i, int maxLength) { 25 if(i>=maxLength){ 26 return data; 27 } 28 int len = data.length; 29 30 //创建10个桶,每个桶中分别用来存放第i位为0~9得数子个数 31 //例如i=0,count[1],就用来存放各位为1得数字个数 32 int[] count = new int[10]; 33 //用来复制数组,辅助排序 34 int[] tmp = new int[len]; 35 36 //将数组中所有得数按照规则放入同种 37 for (int j = 0; j < tmp.length; j++) { 38 count[getNum(data[j], i)]++; 39 } 40 41 //将count[]数字代表桶中数字得个数,变为下标 42 //例如:count[0]原来为1个,count[1]为1个,那么count[1]后面一位得下表就是count[0]+count[1]=2 43 for (int j = 1; j < count.length; j++) { 44 count[j] = count[j-1]+count[j]; 45 } 46 //将原数组总元素按照顺序复制到新数组中 47 for (int j = tmp.length-1; j >= 0; j--) { 48 int number = data[j]; 49 int a = getNum(number, i); 50 tmp[count[a]-1]=number; 51 count[a]--; 52 } 53 return baseSort(tmp, i+1, maxLength); 54 } 55 56 57 /** 58 * 获取一个数字第i位得数字,个位从0开始 59 * @param num 60 * @param i 61 * @return 62 */ 63 private static int getNum(int num,int i){ 64 for (int j = 0; j < i+1; j++) { 65 if(j==i){ 66 num%=10; 67 }else{ 68 num=num/10; 69 } 70 } 71 return num; 72 } 73 74 /** 75 * 获取数组得长度 76 * @param num 77 * @return 78 */ 79 private static int length(int num){ 80 return String.valueOf(num).length(); 81 } 82 83 /** 84 * 查找数组总所有得元素拥有得最大长度 85 * @param data 86 * @return 87 */ 88 private static int getMaxLength(int[] data){ 89 int maxLength = 0 ; 90 for (int i = 0; i < data.length; i++) { 91 if(maxLength<length(data[i])){ 92 maxLength = length(data[i]); 93 } 94 } 95 return maxLength; 96 } 97 98 private static void print(int[] a){ 99 for (int i = 0; i < a.length; i++) { 100 System.out.print(a[i]+" "); 101 } 102 System.out.println(); 103 } 104 }