经典排序算法--基数排序

基本思想:

  基数排序是另外一种比较有特色的排序方式,它不需要直接对元素进行相互比较,也不需要将元素相互交换,你需要做的就是对元素进行“分类”。它是怎么排序的呢?

  
  基数排序(以整形为例),将整形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 }

 

posted @ 2017-05-26 16:44  Will_Don  阅读(379)  评论(0编辑  收藏  举报