数组排序简介-基数排序(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)
}
相关推荐
aaaameliaaa6 小时前
字符函数和字符串函数
c语言·笔记·算法
城管不管7 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
月疯7 小时前
二分法算法(水平等分图形面积)
算法
豆瓣鸡7 小时前
算法日记 - Day3
java·开发语言·算法
白白白小纯8 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode
Achou.Wang8 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
The Chosen One9858 小时前
高进度算法模板速记(待完善)
java·前端·算法
土豆.exe10 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法
黄河123长江11 小时前
有限Abel群的结构()
算法
阿米亚波11 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl