基数排序(时间复杂度O(n))

2023-11-15

算法思想:计数排序无需比较关键字,而是通过分配和收集来实现排序,时间复杂度为线性阶O(n)。对于十进制数来说,每一位在0~9之间,d位的数,则有d列。基数排序首先按低位哟有效数字排,然后逐位向上一位排,直到高位排序结束。

约定:待排数据中没有0和负数,如果有负数转为正数即可。

public class 基数排序 {
    //pos=1表示个位,pos=2表示十位
    public static int getNumInPos(int num, int pos) {
        int tmp = 1;
        for (int i = 0; i < pos - 1; i++) {
            tmp *= 10;
        }
        return (num / tmp) % 10;
    }
    //求得最大位数d
    public static int getMaxWeishu(int[] a) {
        int max = a[0];
        for (int i = 0; i < a.length; i++) {
            if (a[i] > max)
                max = a[i];
        }
        int tmp = 1, d = 1;
        while (true) {
            tmp *= 10;
            if (max / tmp != 0) {
                d++;
            } else
                break;
        }
        return d;
    }
    public static void radixSort(int[] a, int d) {
        int[][] array = new int[10][a.length + 1];
        for (int i = 0; i < 10; i++) {
            array[i][0] = 0;
            // array[i][0]记录第i行数据的个数
        }
        for (int pos = 1; pos <= d; pos++) {
            for (int i = 0; i < a.length; i++) {
                // 分配过程
                int row = getNumInPos(a[i], pos);
                int col = ++array[row][0];
                array[row][col] = a[i];
            }
            for (int row = 0, i = 0; row < 10; row++) {
                // 收集过程
                for (int col = 1; col <= array[row][0]; col++) {
                    a[i++] = array[row][col];
                }
                array[row][0] = 0;
                // 复位,下一个pos时还需使用
            }
        }
    }
    public static void main(String[] args) {
        int[] a = { 49, 38, 65, 197, 76, 213, 27, 50 };
        radixSort(a, getMaxWeishu(a));
        for (int i : a)
            System.out.print(i + " ");
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基数排序(时间复杂度O(n)) 的相关文章

随机推荐

  • Springboot + mybatis-plus 报错 java.nio.file.AccessDeniedException

    记录一次 java nio file AccessDeniedException的解决 先看我的报错信息 Caused by java nio file AccessDeniedException D WorkSpace Java IDEA
  • Unity+Vuforia+Window10打包 PC

    前言 本文参考 http blog csdn net htwzl article details 77488886 实测哦 Vuforia SDK是一个常用的增强现实软件开发工具 其跟踪效果稳定 使用简便 受到大众的喜爱 但是以前的Vufo
  • CentOS 6.4下编译安装MySQL 5.6.14

    概述 CentOS 6 4下通过yum安装的MySQL是5 1版的 比较老 所以就想通过源代码安装高版本的5 6 14 正文 一 卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm qa grep mysql 有的话通
  • 在CentOS 7中安装PHP5和PHP7需要的插件

    安装插件预防安装过程遇见问题 yum install openssl openssl devel bzip2 devel libjpeg devel libpng devel libmcrypt devel fretype freetype
  • python 人民币数字转汉字大写金额

    写了那么久的博客 始于Python爬虫 目前专于Java学习 终于有了属于自己的小窝 欢迎各位访问我的个人网站 未来我们一起交流进步 背景 银行在打印票据的时候 常常需要将阿拉伯数字表示的人民币金额转换为大写表示 现在请你来完成这样一个程序
  • android中log知识总结

    android中的log有很多级别 合理的控制log可以提高的解决问题的效率 减少工作量1 log输出级别 android中的log级别如下 ANDROID LOG UNKNOWN ANDROID LOG DEFAULT ANDROID L
  • http报文结构--个人笔记

    转自 https www cnblogs com ldq2016 p 9055933 html 一个HTTP请求报文由四个部分组成 请求行 请求头部 空行 请求数据 1 请求行 请求行由请求方法字段 URL字段和HTTP协议版本字段3个字段
  • 分类算法之朴素贝叶斯

    1 朴素贝叶斯分类算法 朴素贝叶斯 Naive Bayes NB 算法是基于贝叶斯定理与特征条件独立假设的分类方法 该算法是有监督的学习算法 解决的是分类问题 是将一个未知样本分到几个预先已知类别的过程 朴素贝叶斯的思想就是根据某些个先验概
  • Flex布局及Grid布局

    flex布局及Grid布局 flex布局 flex基本概念 定义 Flex 布局的主要思想 父元素常见属性 display 相同点 差异 flex direaction justify content flex wrap align ite
  • Acwing 905. 区间选点

    1 将每个区间按照右端点从小到大排序 2 从前往后依次枚举每个区间 如果当前区间中已经包含点 则直接pass 否则 选择当前区间的右端点 include
  • 制作linux系统U盘并使用U盘安装CentOS7.5系统

    制作优盘启动盘 工具UltraISO 直接写入制作启动盘参考 Dell服务器点击f11进入bios设置优盘启动 安装时遇到启动分区的问题 解决办法参考 把之前的分区删除就好
  • [架构之路-205]- 常见的需求分析技术:用户故事User Story(用户需求)、用例User Case(系统需求、产品需求)、场景Senario(内部执行流程)区别

    用户故事和用例是一样的吗 人们经常会问这个问题 关于敏捷团队应该实践使用故事还是用例的争论已经持续多年了 用户故事和用例是一回事吗 如果不是 哪一个更好 你应该使用哪一个 或者两者都使用 虽然用户故事和用例之间有一些相似之处 但用户故事和用
  • SQL Server 2005 T-SQL 中的OUTPUT子句语法

    OUTPUT子句是SQL Server 2005 中对INSERT UPDATE和DELETE新增的 今天看见园子里有人提起 SQL2005中返回修改后的数据 就在这里记录一下它的语法 OUTPUT DELETED INSERTED fro
  • pdu长短信格式解释

    from https www cnblogs com leothink archive 2010 12 09 1900925 html
  • 动态网站学习笔记01 网页开发基础

    目录 一 学习目标 二 HTML基础 一 HTML简介 1 HTML 2 HTML语言的基本格式 3 编写一个网页 8 编写HTML文件的常用工具 二 常用的HTML标签 一 段落 行内标签 二 文本样式标签 三 表格标签 四 表单标签 1
  • 聊一聊全景图

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 李洋 前段时间学习了ThreeJS项目里边关于全景图的案例之后 自己动手练习了一下 实现了两个全景图的例子 分别如下 WebGLRender 球型全景图 WebGLRender
  • C从控制台(stdin)输入带空格的字符串到字符数组中

    用scanf s array 的话遇到空格就停止接收后面的字符了 那怎么才能接收带空格的字符串呢 1 用 gets 它可以接收带空格的字符串 直到回车才结束输入 char buf 80 0 gets buf 可以读取空格 回车结束输入 2
  • 出现main() missing 1 required positional argument: 'self'错误的原因

    刚开始通过 python核心编程 学习python 之前并不熟悉python的语法规则 今天在练习GUI编程的文件系统遍历GUI时 出现main missing 1 required positional argument self 错误
  • 装备制造企业数字化转型白皮书(2022年)

    在全球产业格局面临重大调整的情况下 我国装备制造业面临发达国家 再工业化 和其他发展中国家快速进取的双重压力 当世界的制造业正稳步向工业 4 0 迈进之际 我国装备制造企业需借助工业互联网等数字化技术达成根本性的变革 近年来 国家出台了一系
  • 基数排序(时间复杂度O(n))

    算法思想 计数排序无需比较关键字 而是通过分配和收集来实现排序 时间复杂度为线性阶O n 对于十进制数来说 每一位在0 9之间 d位的数 则有d列 基数排序首先按低位哟有效数字排 然后逐位向上一位排 直到高位排序结束 约定 待排数据中没有0