数组排序简介-基数排序(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)
}
相关推荐
闻缺陷则喜何志丹14 分钟前
【背包 组合】P7552 [COCI 2020/2021 #6] Anagramistica|普及+
c++·算法·背包·洛谷·组合
锅挤1 小时前
数据结构复习(第五章):树与二叉树
数据结构
小章UPUP1 小时前
2026年第十六届MathorCup数学应用挑战赛D题国奖思路
算法
hssfscv1 小时前
软件设计师下午试题四——C语言(N皇后问题、分治、动态规划)
c语言·算法·动态规划
lolo大魔王1 小时前
Go语言的反射机制
开发语言·后端·算法·golang
白羊by1 小时前
Softmax 激活函数详解:从数学原理到应用场景
网络·人工智能·深度学习·算法·损失函数
杨凯凡2 小时前
【014】基本类型与包装类:缓存、相等性、NPE
java·数据结构·缓存
故事和你912 小时前
洛谷-算法1-7-搜索3
数据结构·c++·算法·leetcode·动态规划
chipsense2 小时前
霍尔电流传感器选型方法论再升级:从800V平台到TMR竞争的全场景决策树
算法·决策树·机器学习·闭环霍尔·tmr传感
CoderYanger2 小时前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯