【排序算法】—— 计数排序

一、简介

        计数排序,顾名思义就是记录数据出现的次数进行排序,时间复杂度为O(N+K)空间复杂度为O(N)只能用于整型,对于比较集中重复率比较高数据更为适用

二、排序原理

比如对接下来这些数进行排序

                arr[11] = { 8,6,4,1,6,2,9,6,2,4,3 }

        定义一个tmp用来记录数字出现的次数,那么tmp的长度可以设为需要排序的最大的数字加1,因为我们要做的是用下标来表示这个数

                比如tmp[6]=2,其中下标6表示6这个数字,2表示出现两次

        所以得先把tmp初始化为0,然后进行计数,比如第一个数字为1那么就在1下标位置加1,以此类推遍历完数组arr。然后根据每个数出现的个数依次赋值给原数组arr。

#include<stdio.h>
int main()
{int arr[11] = { 8,6,4,1,6,2,9,6,2,4,3 };int tmp[10] = { 0 };for (int i = 0; i < 11; i++)tmp[arr[i]]++;for (int i = 0, j = 0; i < 10; i++){while (tmp[i]--){arr[j++] = i;}}for (int i = 0; i < 11; i++)printf("%d ", arr[i]);return 0;
}

        那这些数据比较大呢,比如下面这组数据
                {1004 1003 1000 1015 1004 1004 1012 1006 1003 1014}
        需要申请长为1015的数组大小吗?
        其实并不需要,只需要申请长度为16的数组进行记录就行,记录的时候先减去1000,等赋值给原数组的时候再加回去就行。

        所以到底如何考虑申请多少空间呢?,其实只需要最大的值减最小的值再加1的长度的数组空间就够用了。同样在记录时先减去最小值,等赋值给原数组的时候再加回去。

void Sort(int* arr, int size)
{int max = arr[0], min = arr[0];for (int i = 0; i < size; i++){if (max < arr[i])max = arr[i];if (min > arr[i])min = arr[i];}int ret = max - min + 1;int* tmp = (int*)calloc(ret,sizeof(int));assert(tmp);for (int i = 0; i < size; i++)tmp[arr[i]-min]++;for (int i = 0, j = 0; i < ret; i++){while (tmp[i]--)arr[j++] = i + min;}
}

三、适用范围

        计数排序的缺点就是只能对整型数据进行排序,不能对字符,浮点形还有结构体类型进行排序。而且对于整形的排序他更适合的是最小值和最大值跨度比较小的数据,或者重复率比较高的数据。比如10个整数最小的是1最大的那个是100万。使用计数排序就会导致空间的开销很大,效率也比较低。

四、源码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
void Sort(int* arr, int size)
{int max = arr[0], min = arr[0];for (int i = 0; i < size; i++){if (max < arr[i])max = arr[i];if (min > arr[i])min = arr[i];}int ret = max - min + 1;int* tmp = (int*)calloc(ret,sizeof(int));assert(tmp);for (int i = 0; i < size; i++)tmp[arr[i]-min]++;for (int i = 0, j = 0; i < ret; i++){while (tmp[i]--)arr[j++] = i + min;}
}
int main()
{srand((unsigned int)time(NULL));int arr[15];for (int i = 0; i < 15; i++)arr[i] = rand() % 100 + 1;for (int i = 0; i < 15; i++)printf("%d ", arr[i]);Sort(arr, 15);printf("\n");for (int i = 0; i < 15; i++)printf("%d ", arr[i]);return 0;
}

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

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

相关文章

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…

Bash 学习摘录

文章目录 1、变量和参数的介绍&#xff08;1&#xff09;变量替换$(...) &#xff08;2&#xff09;特殊的变量类型export位置参数shift 2、引用&#xff08;1&#xff09;引用变量&#xff08;2&#xff09;转义 3、条件判断&#xff08;1&#xff09;条件测试结构&#xff08…

vue自定义折叠Tree,自定义折叠树

使用组件 <TreeNode v-for"(node, index) in nodes" :key"index" :node"node" />JSON数据 let nodes[{"id": 2030,"show_id": "MC1813024492270223360","detail_type": 1,"title": &…

Geometric Transformer for Fast and Robust Point Cloud Registration 论文解读

目录 一、导言 二、先导知识 1、超点匹配 2、KPConv 三、相关工作 1、基于对应的方法 2、直接配准方法 3、深度鲁棒估计 四、GeoTransformer模型 1、特征提取 2、超点匹配 几何自注意力模块 特征交叉注意力 计算高斯相关性 对应点采样 3、点匹配 4、局部到全局…

花开半夏,我决意仿一款答题小程序

不是清凉罢挥扇&#xff0c;自缘手倦歇些时。 ——杨万里&#xff08;宋&#xff09; 走过春的绚烂&#xff0c;路过初夏的清凉&#xff0c;我们迎来了炎炎夏日。蛙声阵阵&#xff0c;蝉鸣声声&#xff0c;稻花如白练&#xff0c;荷花别样红。 花开半夏&#xff0c;我决意仿一款…

陕西技术交易大会璀璨起航,卓翼飞思无人智能领域研究成果备受瞩目

智启未来&#xff0c;链动四方。万众瞩目的陕西省技术交易大会于7月17-18日在西安璀璨启航&#xff01;大会聚焦智能感知及其上下游产业链&#xff0c;旨在促进四链深度融合&#xff0c;推动技术创新与产业发展。卓翼智能作为产业链中“智能感知应用端”的杰出企业代表&#xf…

【刷题专项】— 模拟

1、替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先找到需要替换的 ? &#xff0c;位置然后遍历26个字母与 ? 的左右两边的是否相同&#xff0c;不同的话就替换最后返回即可代码&#xff1a; public String modifyString(String s) {char[] c…

MySQL运维实战之Clone插件(10.1)使用Clone插件

作者&#xff1a;俊达 clone插件介绍 mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表&#xff0c;clone得到的是原数据库的一个一致性的快照&#xff0c;可以使用该快照数据来启动新的实例。cl…

Android View的绘制流程

1.不管是View的添加&#xff0c;还是调用View的刷新方法invalidate()或者requestLayout()&#xff0c;绘制都是从ViewRootImpl的scheduleTraversals()方法开始 void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled true;mTraversalBarrier mHandler…

【论文速读】| TCSR-SQL:面向表内容感知的自检索文本到SQL方法

本次分享论文&#xff1a;TCSR-SQL: Towards Table Content-aware Text-to-SQL with Self-retrieval 基本信息 原文作者&#xff1a;Wenbo Xu, Liang Yan, Peiyi Han, Haifeng Zhu, Chuanyi Liu, Shaoming Duan, Cuiyun Gao, Yingwei Liang 作者单位&#xff1a;哈尔滨工业大…

Java垃圾收集器选择与优化策略

1.垃圾收集算法有哪些,可以聊一下吗? 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾。 1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾。如果一个对象没有任何指针对其引用,它就是垃圾。 弊端:如果…

【网络工具】Charles 介绍及环境配置

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/iAmAo &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会整理一些工作或学习中用到的工具介绍给大家~ &#x1f4d8;Charles 系列其它文章&#xff1a;【网络…

JavaScript基础 第四弹 学习笔记

函数 1、为什么需要函数&#xff1f;可以实现代码复用&#xff0c;提高开发效率。 函数的定义 &#xff1a;函数function&#xff0c;是被设计为执行特定任务的代码块。 函数可以把具有相同或相似逻辑的代码‘包裹’起来&#xff0c;通过函数调用执行这些被“包裹”的代码逻…

万界星空科技电线电缆MES系统实现线缆全流程追溯

MES系统通过高度集成的数据平台&#xff0c;对电线电缆的生产全过程进行实时监控与记录&#xff0c;从原材料入库开始&#xff0c;到生产过程中的各个关键控制点&#xff0c;再到成品出库&#xff0c;每一步操作都被详细记录并可追溯。这种全流程追溯能力主要体现在以下几个方面…

java基础之变量,类型的转换,跟着哔站尚硅谷自学笔记。

变量 变量的介绍以及使用 1.变量的数据类型&#xff1a;基本数据类型&#xff1a;4类8种整数&#xff1a;byte short int long 浮点数&#xff1a;float double字符型&#xff1a;char布尔型&#xff1a;boolean引用数据类型&#xff1a;类 数组 接口 枚举 注解2.概述&#xf…

云南合续-马来西亚水环境项目考察单位

2024年恰逢中马建交50周年&#xff0c;中华环保联合会为进一步加强双方生态产业合作与交流&#xff0c;拟定于9月23日-29日组团赴马来西亚开展水环境项目考察&#xff0c;同期举办“2024中马水务合作论坛”&#xff0c;引领国内先进环保技术、装备、产能“走出去”。

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …

verilog刷题笔记

1、选择器实现方式 &#xff08;1&#xff09;case语句&#xff0c;注意default &#xff08;2&#xff09;if-else语言&#xff0c;注意else&#xff0c;有优先级 &#xff08;3&#xff09;三元运算符 &#xff1f; &#xff1a; 2、阻塞赋值/非阻塞赋值都是过程性赋值&a…

使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试》&#xff08;作者&#xff1a;尚雷&#xff09;&#xff0c…

提交(git-add git-commit git-push)

当修改好一个功能的时候&#xff0c;可以提交到远程仓库&#xff0c;这样就等于更新了一次版本&#xff0c;那么下次改修了文件的话&#xff0c;是跟这个版本做对比的 git status&#xff0c; 查看文件修改情况&#xff0c;git add 假如你只想提交1个文件&#xff0c;那么直接…