数据结构和算法-计数排序

news2025/1/8 18:11:08

1.算法描述

技术排序是一个基于比较的排序算法,该算法于1954由Harold H. Seward 提出。它的优势在于对

一定范围内的整数排序时,它的复杂度为O(n+k)(其中k是整数的范围),快于任何比较排序算

法。当然这是一种牺牲空间换取时间排序的做法,而且当O(K)>O(nlogn)的时候其实效率反而不

如基于比较的排序(基于比较的排序的时间时间复杂度在理论的上的下线是O(nlog(n)),如

归并排序,堆排序)

技术排序是一种适合于最大值和最小值的差值不是很大的排序,也就是说重复的数据会比较多的情况。

 

具体实现过程如下:

首先遍历整个数组,找到最大的数字。

任何根根据最大的数字创建一个临时数组用于统计每个数字出现的字数,例如temp[i]=m,表示元素i

一共出现了m次。

最后再把临时数组统计的数据从小到大返回到原来的数组中,这样就是有序的。

 2.算法实现

分解1: 找到最大的数字,并且以数字的大小创建一个统计数组

注:这里数组长度应该是max+1;

分解2:

遍历未排序数组获取,统计每一个数字出现的次数根据下标添加到新的统计数组中 

分解3:将统计数组对应的下标的数字返回到排序数组中

 

代码

package Sort;

public class CountSort {
    public static void main(String[] args) {
        int[] arrs = {0, 2, 1, 3, 0, 2, 0, 1, 1};
        //遍历数组找到最大的值
        int max = arrs[0];

        for (int i = 0; i < arrs.length ; i++) {
            if(arrs[i]>max){
                max=arrs[i];
            }
        }
        //根据最大值创建统一数组
        int[] countArrs=new int[max+1];
        for (int i = 0; i < arrs.length; i++) {
            int k = arrs[i];
            //以k作为下标进行统计
            countArrs[k]++;
        }
        int k=0;//统计数组的下标
        int index=0;//排序数组的下标
        while(k<countArrs.length){
            //判断统计数组中的值是否大于0
            while (countArrs[k]>0){
                //将对应的下标返回到排序数组中
                arrs[index++]=k;
                countArrs[k]--;
            }
            k++;
        }
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]);
        }
    }
}

统计数组优化:

如果待排序的数字很大,那么在创建数组的时候会浪费没有空间,同时也会导致创建的数组太大,

所以需要进行优化;

可以通过使用最大数字减去最小数字求出需要数组的大小。

public class CountSort {
    public static void main(String[] args) {
        int[] arrs = {90, 92, 91, 93, 90, 92, 90, 91, 91};
        //遍历数组找到最大的值
        int max = arrs[0];
        int min = arrs[0];
        for (int i = 0; i < arrs.length ; i++) {
            if(arrs[i] > max){
                max=arrs[i];
            }
            if(arrs[i] < min) {
                min = arrs[i];
            }

        }
        //根据最大值创建统一数组
        int[] countArrs=new int[max-min+1];
        for (int i = 0; i < arrs.length; i++) {
            //获取值的时候需要减去min获取下标
            int k = arrs[i]-min;
            //以k作为下标进行统计
            countArrs[k]++;
        }
        int k=0;//统计数组的下标
        int index=0;//排序数组的下标
        while(k<countArrs.length){
            //判断统计数组中的值是否大于0
            while (countArrs[k]>0){
                //将对应的下标返回到排序数组中
                //需要还原成执行的值,使用下标加上最小值
                arrs[index++]=k + min;
                countArrs[k]--;
            }
            k++;
        }
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE高阶---Spring事务和事务传播机制

一&#xff1a;什么是事务&#xff1f; 事务定义&#xff1a;将⼀组操作封装成⼀个执⾏单元&#xff08;封装到⼀起&#xff09;&#xff0c;要么全部成功&#xff0c;要么全部失败。 二&#xff1a;Spring中事务的实现 编程式事务&#xff08;⼿动写代码操作事务&#xff09…

使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris

简介 主要内容如下&#xff1a; MySQL 安装和开启binogFlink环境准备Apache Doris 环境准备启动Flink CDC作业 1. MySQL 安装和开启binog 参考文章&#xff1a;Ubuntu 安装 Mysql server, 这篇文章介绍了MySQL的安装&#xff0c;用户创建&#xff0c;Binlog开启等内容。 M…

Linux基础入门和常用命令

Linux基础入门和常用命令一. Linux介绍1.1 Linux的发行版本二. Linux环境搭建三. Linux的常用指令3.1 Linux下的目录结构3.2 ls命令3.3 pwd命令3.4 cd指令3.5 touch指令3.6 mkdir指令3.7 rmdir指令和 rm 指令3.8 man指令3.9 mv指令3.10 cp指令3.11 cat3.12 more指令3.13 less指…

基于机器学习组合模型的个人信用评估

《基于机器学习组合模型的个人信用评估》课程报告 摘要 个人信用评估在信用经济市场发挥着及其重要的基础作用&#xff0c;促进信用经济的发展&#xff0c;稳定经济市场。个人信用信息主要有个人基本信息、还款能力和还款意愿;个人基本信息主要由年龄、性别、地区等特征构成&…

C语言灵魂核心——指针深度修炼

&#x1f412;个人主页&#xff1a;平凡的小苏&#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情目录 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、…

【读论文】TCPMFNet

【读论文】TCPMFNet简单介绍网络结构编码器图像融合网络Vision Transformer特征融合网络网格连接解码器损失函数总结参考论文&#xff1a;https://www.sciencedirect.com/science/article/pii/S1350449522003863 如有侵权请联系博主 简单介绍 今天要介绍的是TCPMFNet&#xf…

六大排序算法

1. 插入排序步骤&#xff1a;1.从第一个元素开始&#xff0c;该元素可以认为已经被排序2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描3.如果该元素大于tem&#xff0c;则将该元素移到下一位4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素5.tem…

如何使用 Pandas 清洗二手房数据并存储文件

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据清洗 三、菜鸟实战 清洗前的文件 读取源文件 对二手房数据进行清洗 清洗完成后保存到文件 运行结果 运行截图 结果文件 一、实战场景 如何使用 Pandas 清洗的二手房数据并存储文件 二…

初识结构体(详细版)

目录 一、结构体的声明 1、结构的基础知识 2、结构的声明 3、结构成员的类型 4、结构体变量的定义和初始化 二、结构体成员的访问 1、点操作符访问 2、->操作符访问 3、解引用访问 三、结构体嵌套 四、结构体传参 1、传值调用 2、传址调用 一、结构体的声明 1、结构的基…

Vue2前端路由(vue-router的使用)

一、vue2axiosExpressMySQL实现前后端交互1、后台&#xff1a;&#xff08;1&#xff09;确定MySQL的表格&#xff1a;明确数据库 &#xff08;mvc&#xff09; —- 数据表(ssm_book)&#xff08;2&#xff09;创建Express项目&#xff1a;mysql2、cors、Sequelize(ORM)、nodem…

imx6ull Linux sdk下载验证

本文章是基于整点原子的imx6ull alpha开发板一.Linux SDK源码以及image1.环境准备其他的工具我们就不做介绍了&#xff0c;比如ubuntu ftp,ssh等等&#xff0c;我们主要来介绍下编译链1.1 交叉编译链背景&#xff1a;因为在原子的教程中有强调最新的Linaro gcc编译完uboot后无法…

备受认可!中睿天下荣登“2022创业邦100未来独角兽”年度榜单

近日&#xff0c;由创业邦、复旦大学管理学院主办的2022创业邦100未来独角兽峰会暨创业邦年会在上海举办。在峰会现场&#xff0c;2022创业邦100未来独角兽榜单正式揭晓&#xff0c;中睿天下凭借出众的综合实力荣登榜单。作为一家以“实战对抗”为特点的能力价值型网络安全厂商…

Java版设计模式/设计模式的作用是什么/类之间有哪些关系?又怎么表示

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 1. 设计模式概述 1.1 设计模式创始“4人组” ErichGamma–艾瑞克伽马Richard Helm—理查德赫尔码Ralph Johnson----拉尔夫约翰逊John Vlissides—约翰威力斯蒂斯…

【Linux】Linux编译器-gcc/g++的使用和程序执行的基础底层原理

Linux编译器1.gcc/g 的使用2. 程序的基本翻译过程3.预处理3.1验证预处理的功能&#xff08;gcc -E&#xff09;4.编译&#xff08;变成汇编语言&#xff09;4.1验证编译过程&#xff08;gcc -S&#xff09;5.汇编&#xff08;生成机器可识别代码&#xff09;5.1验证汇编过程&am…

K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示一、资源说明二、基本参数1.参数2.引脚说明三、驱动说明时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RCDHT11模块1.2、STM32F103C8T6DHT11模块五、基础知识学习与相关资料下载六、视频效果展示与程序资…

内核解读之内存管理(4)内存管理三级架构之page

我们前面介绍了linux内存管理的三级架构&#xff0c;node->zone->page。本节就来介绍page。 页是内核管理内存的基本单位&#xff0c;体系结构不同&#xff0c;支持的页大小也不尽相同&#xff0c;还有些体系结构甚至支持几种不同的页大小。大多数32位体系结构支持4KB的页…

【Python】爬取弹幕并保存到Excel中

hello&#xff0c;我是李华同学&#xff0c;最近开始学习爬虫&#xff0c;下面是我实现的一个得到弹幕的代码&#x1f60f;找一个URL&#x1f449;想要得到一个网站的内容&#xff0c;首先要找到你想要内容的具体位置&#xff0c;首先你先找到一个有弹幕的地方&#xff0c;找到…

linux系统重装yum工具与python环境

文章目录前言一、强制删除原有环境1.删除python2.删除yum二、安装新环境前置准备三、下载依赖命令1.内核版本7.6.1810下载python依赖包下载yum包2.内核版本7.4.1708下载python依赖包下载yum包3.内核版本7.8.2003下载python依赖包下载yum依赖包4.下载结果四、安装前言 安装之前…

swagger入门

目录 1.前后端分离的特点 2.在没有swagger之前 3.swagger的作用 4.swagger的优点 5.集成swagger 5.1 新建springboot项目 5.2 集成swagger 5.3 开发一个controller用于测试 5.4 启动服务&#xff0c;验证集成效果 6.swagger常用注解 7.swagger使用综合案例 8.会议OA之sw…

第三章 Flink DataStream API

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、DataStream API是什么&#xff1f; Flink 中的 DataStream 程序是对数据流&a…