常用排序算法总结8一一基数排序

定义

基数排序(英语:Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

基数排序过程

算法步骤

  • 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
  • 然后,从最低位开始,依次进行一次排序。
  • 这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

注意本次演示采用LSD的方式实现

代码实现(java)

/**
 *
 * Description: 基数排序的简单实现,目前只能排序正整数
 * @param: @param nums
 * @param: @return
 * @return: int[]
 * @throws
 */
public static int[] radixSort(int[] nums)
{
    int BASE = 10;          // 整数基数
    int len = nums.length;
    int[] buffer = new int[len];

    int maxValue = nums[0], exp = 1;

    // 找出nums数组中最大的数
    for (int i = 1; i < len; i++) {
        if (nums[i] > maxValue) {
            maxValue = nums[i];
        }
    }

    while (maxValue / exp > 0) {
        int[] bucket = new int[BASE];

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

        // 从数的低位开始进行桶排序
        for (int i = 0; i < len; i++) {
            bucket[(nums[i] / exp) % BASE]++;
        }

        // 按照当前位给nums排序,确定各个数对应的大概位置buket[(nums[i] / exp) % BASE]的值
        // 即为新位置的下标
        for (int i = 1; i < BASE; i++) {
            bucket[i] += bucket[i - 1];
        }

        // 按当前位进行排序存入到新数组
        for (int i = len - 1; i >= 0; i--) {
            int index = (nums[i] / exp) % BASE;
            buffer[--bucket[(nums[i] / exp) % BASE]] = nums[i];
        }

        for (int i = 0; i < len; i++) {
            nums[i] = buffer[i];
        }

        exp *= BASE;
    }
    return nums;
}

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,215评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,742评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,271评论 0 2
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,292评论 0 35
  • 最后的半分钟了,人们不约而同的静默着,等待着。广场上,喷水池的水喷的老高,鸟儿在石砖上跳着,蝴蝶在花间飞舞着。 林...
    疏阁阅读 139评论 0 0