当前位置: 首页 > article >正文

数组排序简介-基数排序(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)

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)
}


http://www.kler.cn/a/377070.html

相关文章:

  • Rust 构建与测试自动化
  • 完整的 Vue 2 + TypeScript + Vuex 的项目案例
  • jEasyUI 树形菜单添加节点
  • Docker — 跨平台和环境部署
  • 论文翻译 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES
  • 线上演示服务环境的搭建
  • 使用Node.js内置的http模块创建简单的HTTP服务器,并根据请求的路径返回不同的文本响应。
  • 数据库连接池实现
  • C++(友元、异常机制、静态成员、单例模式)
  • 【MySQL】InnoDB存储引擎内存结构Ⅱ
  • Linux curl命令下载显示时间/速度/大小
  • LLC Power Switches and Resonant Tank 笔记
  • 【算法-选择排序】挑挑拣拣,排出顺序——选择排序入门
  • 大学城水电资源管理:Spring Boot解决方案
  • 使用Python高效处理CSV和Excel文件的多种方法
  • 基于Spring Boot的信息学科平台系统开发与优化
  • LeetCode 每日一题 2024/10/28-2024/11/3
  • 用Fiddler如何对Jmeter的请求进行抓包
  • python的json库的基本应用
  • 富格林:可信措施提升追损效率