zoukankan      html  css  js  c++  java
  • 经典排序算法--基数排序

    基本思想:

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

      
      基数排序(以整形为例),将整形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("
    排序后:");
      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 }
  • 相关阅读:
    JavaScript递归函数解“汉诺塔”
    《JavaScript DOM编程艺术》学习笔记(三)
    《JavaScript DOM编程艺术》学习笔记(二)
    《JavaScript DOM编程艺术》学习笔记(一)
    《手把手教你实现电商网站开发》课程学习总结
    学校水卡、本地公交卡破解记
    第一篇博客
    mysql5.7.5以上版本使用distinct和order by 报错备忘录
    group_concat长度限制踩坑备忘录
    ArrayList、LinkedList、Vector的区别
  • 原文地址:https://www.cnblogs.com/xsyfl/p/6909337.html
Copyright © 2011-2022 走看看