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

基数排序(学习)

一、基数排序描述

  1. 基数排序(radix sort)属于分配式排序,又被称为桶子法,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用
  2. 基数排序法属于稳定的排序,基数排序法的是效率高的稳定性排序法
  3. 基数排序是桶排序的扩展

二、基数排序描述

        将所有待比较数值统一为同样的数位长度,数为较短的数前面补零,然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高为排序完成后,数列就变成了一个有序序列

三、实现步骤

(1)确定数组中的最大元素有几位(MAX)(确定执行的轮数)

(2)创建0~9个桶(桶的底层是队列),因为所有的数字元素都是由0~9的十个数字组成

(3)依次判断每个元素的个位,十位至MAX位,存入对应的桶中,出队,存入原数组;直

         至MAX轮结束输出数组。

(4)具体实现步骤如下图

 四、代码实现

public int[] RadixSort(int[] array)
    {
        int max = array[0];
        foreach (var item in array)
        {
            max = item > max ? item : max;
        }

        int maxDigit = 0;       //得到最外层桶子的数量(便利几次)
        while (max != 0)
        {
            max /= 10;
            maxDigit++;
        }

        //创建新桶
        var bucket = new List<List<int>>();
        for (int i = 0; i < 10; i++)
        {
            bucket.Add(new List<int>());
        }


        //此处的代码对应(三、实现步骤,图文结合易于理解)
        for (int i = 0; i < maxDigit; i++)
        {
            //从个位到最高位,依次填充到对应的桶子中去
            int div = (int)Math.Pow(10, (i + 1));   
            foreach (var item in array)
            {
                int radix = (item % div) / (div / 10);
                bucket[radix].Add(item);
            }

            //将桶中的数据反向填充到数组中
            int index = 0;
            foreach (var item in bucket)
            {
                foreach (var it in item)
                {
                    array[index++] = it;
                }
                item.Clear();
            }
        }
        return array;
    }

 五、应用场景

  • 在某个数字可能很大的时候,基数排序没有任何性能上的优势,还会浪费非常多的内存。

  • 适用于代比较数组中元素,长度大概相同的情况,如:手机号排序、字符串排序和身份证排序等。

参考文档:基数排序(详细图解)

C# 算法之基数排序排序(非比较排序之三) - 灰信网(软件开发博客聚合)

数据结构与算法(17):基数排序及其应用实例

相关文章:

  • hive窗口函数最全总结
  • Vulnhub靶场 ICA: 1
  • Tomcat部署
  • 大数据如何进行测试
  • python基础专栏13-python基础篇-控制结构
  • 3.4 创建共用模块-供其它模块使用
  • 通用Excel表格导出(Map类型数据导出为表格)
  • leetcode刷题 (9.1) 动态规划
  • 【C++】如何理解函数调用中的传值和传址
  • 糖尿病会隐身,这些信号一定要重视
  • 智能驾驶功能软件平台设计规范第五部分:定位功能服务接口
  • 框架阶段六:SpringCloud
  • 《effecttive C++》和一些其他C++开发的东西的学习总结(长期更新)
  • 登录测试用例
  • hadoop笔记——YARN部署
  • 2019.2.20 c++ 知识梳理
  • C++11: atomic 头文件
  • GraphQL学习过程应该是这样的
  • JSDuck 与 AngularJS 融合技巧
  • Meteor的表单提交:Form
  • mysql常用命令汇总
  • mysql中InnoDB引擎中页的概念
  • node学习系列之简单文件上传
  • Object.assign方法不能实现深复制
  • tweak 支持第三方库
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从输入URL到页面加载发生了什么
  • 番外篇1:在Windows环境下安装JDK
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端技术周刊 2019-01-14:客户端存储
  • 实现菜单下拉伸展折叠效果demo
  • 运行时添加log4j2的appender
  • 做一名精致的JavaScripter 01:JavaScript简介
  • FaaS 的简单实践
  • zabbix3.2监控linux磁盘IO
  • 如何在招聘中考核.NET架构师
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (LeetCode 49)Anagrams
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (六)Hibernate的二级缓存
  • (七)Knockout 创建自定义绑定
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 物件導向與老子思想 (OO)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转载)利用webkit抓取动态网页和链接
  • .net Application的目录
  • .net php 通信,flash与asp/php/asp.net通信的方法