数组排序简介-基数排序(Radix Sort)

基本思想

将整数按位数切割成不同的数字,然后从低位开始,依次到高位,逐位进行排序,从而达到排序的目的。

算法步骤

基数排序算法可以采用「最低位优先法(Least Significant Digit First)」或者「最高位优先法(Most Significant Digit first)」。最常用的是「最低位优先法」。

下面我们以最低位优先法为例,讲解一下算法步骤。

  1. 确定排序的最大位数:遍历数组元素,获取数组最大值元素,并取得对应位数。
  2. 从最低位(个位)开始,到最高位为止,逐位对每一位进行排序
    1. 定义一个长度为 10的桶数组 buckets,每个桶分别代表 0∼9 中的 1 个数字。
    2. 按照每个元素当前位上的数字,将元素放入对应数字的桶中。
    3. 清空原始数组,然后按照桶的顺序依次取出对应元素,重新加入到原始数组中。

692,924,969,503,871,704,542,436为例,演示一下基数排序算法的整个步骤。

适用场景

大规模整数排序,固定长度数据排序,稳定性要求高的排序场景,数据分布较为均匀的情况,外部排序场景

排序稳定性

基数排序采用的桶排序是稳定的。基数排序是一种 稳定排序算法

代码实现(golang)

Go 复制代码
func getMax(arr []int) int {
    max := arr[0]
    for _, v := range arr {
        if v > max {
            max = v
        }
    }
    return max
}

func radixSort(arr []int) []int {
    max := getMax(arr)
    exp := 1
    for max/exp > 0 {
        buckets := make([][]int, 10)
        for _, v := range arr {
            digit := (v / exp) % 10
            buckets[digit] = append(buckets[digit], v)
        }
        arr = []int{}
        for _, bucket := range buckets {
            arr = append(arr, bucket...)
        }
        exp *= 10
    }
    return arr
}

func main() {
    arr := []int{170, 45, 75, 90, 802, 24, 2, 66}
    sortedArr := radixSort(arr)
    fmt.Println(sortedArr)
}
相关推荐
小O的算法实验室7 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
小飞学编程...7 小时前
【哈希表】
数据结构·哈希算法·散列表
Tbisnic8 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx8 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归9 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing10 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习10 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨10 小时前
基础数论总结
笔记·学习·算法
动词ing11 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
夜不会漫长12 小时前
C++入门(1)
开发语言·c++·算法