数组排序简介-基数排序(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)
}
相关推荐
Jerry2 小时前
LeetCode 189. 轮转数组
算法
Jerry3 小时前
LeetCode 739. 每日温度
算法
2601_954526757 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索8 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
c2385610 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa11 小时前
指针之总结
c语言·笔记·算法
宵时待雨11 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz11 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf21611 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp11 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu