首页 > 编程语言 > 详细

基数排序

时间:2021-02-20 12:03:07      阅读:23      评论:0      收藏:0      [点我收藏+]

基数排序

1、思想

  • 将待排序序列中的所有元素统一成一样的数位长度,数位较短的数在前面补零

  • 从最低位开始,依次进行排序

  • 从最低位到最高位排序完成后,序列就变成了有序序列

 

2、示意图

 技术分享图片

 

3、代码实现

技术分享图片
public static int[] sort(int[] array){
?
    // 找数组中最大值
    int max = array[0];
    for (int i = 1; i < array.length; i++) {
        if (array[i] > max){
            max = array[i];
        }
    }
?
    // 得到最大值的位数
    int length = (max + "").length();
?
    // 建立一个桶
    int[][] bucket = new int[10][array.length];
    // 记录每个桶存放了多少数据
    int[] bucketCount = new int[10];
?
    for (int i = 1; i <= length; i++) {
?
        // 求位数(个,十,百......),并放入桶中
        for (int j = 0; j < array.length; j++) {
?
            /**
                 * 位数,规律为:
                 *      个位数:array[j] / 1 % 10  <===>  array[j] / (1 * 10 ^ 0) % 10
                 *      十位数:array[j] / 10 % 10  <===>  array[j] / (1 * 10 ^ 1) % 10
                 *      百位数:array[j] / 100 % 10  <===>  array[j] / (1 * 10 ^ 2) % 10
                 *      ......
                 */
            int num = (int) ((array[j] / (1 * Math.pow(10, (i - 1)))) % 10);
            // 放到桶里,第几个桶(num)的第几个位置(bucketCount[num])
            bucket[num][bucketCount[num]] = array[j];
            // 桶数据加一
            bucketCount[num] ++;
        }
?
        // 从桶中取出,放到原来的数组中
        // 数组下标索引
        int count = 0;
        // 第一层,10个桶
        for (int k = 0; k < 10; k++) {
?
            // 如果这个桶中有元素
            if (bucketCount[k] != 0) {
                // 第二层,每个桶中的值
                for (int z = 0; z < bucketCount[k]; z++) {
                    array[count] = bucket[k][z];
                    count ++;
                }
            }
            // 该桶中的值取完后,把桶计数清零
            bucketCount[k] = 0;
        }
?
        // 所有的桶取完后,对桶清零
        for (int j = 0; j < bucket.length; j++) {
            for (int k = 0; k < bucket[i].length; k++) {
                bucket[j][k] = 0;
            }
        }
    }
?
    return array;
}
View Code
 

 

4、时间测试

  • 2000万个随机数,使用基数排序进行测试,费时大概 5秒 左右

技术分享图片
public static void main(String[] args) {
?
    int[] array = new int[20000000];
    for (int i = 0; i < 20000000; i++) {
        array[i] = (int)(Math.random() * 20000000);
    }
?
    Date date = new Date();
    long start = date.getTime();
    String formatDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
?
    System.out.println("排序前的时间为:" + formatDate);
?
    sort(array);
?
    Date dateAfter = new Date();
    long end = dateAfter.getTime();
    String formatDateAfter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
?
    System.out.println("排序后的时间为:" + formatDateAfter);
    System.out.println("排序总共费时" + ((end - start) / 1000) + "s!");
?
}
View Code

基数排序

原文:https://www.cnblogs.com/LittleSkinny/p/14419717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!