09-基数排序(Radix Sort)

基数排序(Radix Sort)

基数排序非常适合用于整数排序(尤其是非负整数),所以在本节内容中,只演示对非负整数进行基数排序,因为如果是负数或者是小数,就会非常麻烦,有兴趣的读者,也可以自己研究负数或者小数的基数排序。

接下来就来了解以下基数排序的执行流程

依次对个位数,十位数,百位数,千位数,万位数...进行排序(从低位到高位)

看起来非常神奇,这样就能把一堆数据排序了吗?可以看下面的示例,有一堆如下图所示的整数

经过第一轮,对个位数进行排序后的结果如下

第一轮排完序以后,再对十位数进行排序,如果没有十位数的元素,把十位数当做0来处理,排序后的结果如下

再对百位数进行排序,没有百位数的,也当做百位数为0进行处理,排序的结果为

通过这样,就将上面的序列排好序了。不过请大家注意,不能先对高位数进行排序,再对低位数进行排序。

再仔细观察可以发现,在每一轮进行排序时,实际上是对整数范围内0-9的元素进行排序。所以说到这里,你肯定想到了,每一轮的排序可以利用上一节介绍的计数排序来实现。接下来,就将上面的代码进行实现。

protected void sort() {
    //找出最大值
    int max = array[0];
    for (int i = 1; i < array.length; i++) {
        if (array[i] > max) {
            max = array[i];
        }
    }
    for (int devider = 1; devider <= max ; devider *= 10) {
        countingSort(devider);
    }
}

protected void countingSort(int devider) {
    int[] counts = new int[10];
    for (int i = 0; i < array.length; i++) {
        counts[array[i] / devider % 10]++;
    }
    // 累加次数
    for (int i = 1; i < counts.length; i++) {
        counts[i] += counts[i - 1];
    }

    int[] newArray = new int[array.length];
    for (int i = array.length - 1; i >= 0; i--) {
        newArray[--counts[array[i] / devider % 10]] = array[i];
    }

    for (int i = 0; i < newArray.length; i++) {
        array[i] = newArray[i];
    }
}

利用相同的元素,与前面介绍的几种排序算法进行比较,最终得到的结果如下

可以看到,基数排序表现依然非常优秀。

时间复杂度分析

最好,最坏,平均时间复杂度:O(d*(n+k)),d是最大值的个位数,k是进制,并且属于稳定的排序算法

空间复杂度:O(n+k)

demo下载地址

完!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,605评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,034评论 0 2
  • 版本记录 前言 排序算法是最常见的算法,其中包括了冒泡、选择等很多不同的排序算法,接下来几篇就会介绍相应的排序算法...
    刀客传奇阅读 4,693评论 0 1
  • 今天休息,下班回到家,儿子还没上幼儿园,一进门儿子告诉我说妈妈我今天生日,你给我订蛋糕啊,我说好的妈妈一定给你订蛋...
    海浪花_2642阅读 1,382评论 0 1
  • 你的心态,会支撑你一路的发展; 你的眼界,会决定你选择的方向; 你的格局,会意味着你成就多大的规模; 你的毅力,会...
    悦盈阅读 1,130评论 0 0

友情链接更多精彩内容