计数排序详解

前言:这篇文章会给大家把计数排序安排的明明白白,详细的讲解计数排序的原理

例子:现在我有一个数组不知道里面到底有多少个元素,但是我要把它进行排序,怎么排序呢?

我先随便拿一个数组(你假装你不知道里面的元素个数和元素)

int arr[5] = {1000,1001,1008,1007,1009}

然后我们需要找到这个数组的最大值和最小值的差值,然后得出一个闭区间,就是每两个数之间的差值的绝对值就是在这个范围里面也就是[0,max-min]

找到范围后,再做什么呢?

再就是把这个范围进行拓宽成一个整型数组

1000到1009是10个元素

这个数组全部初始化为0

也就是int a[10]={0,0,0,0,0,0,0,0,0,0}

       对应下标     0 1 2 3 4 5 6 7 8 9

我们找每一个元素-min得出来的差值,这个差值就是a数组每一个对应的下标,每找出来一个差值就对应的a[i]++

之后数组变成了int a[10]={1,1,0,0,0,0,0,1,1,1}

然后我们怎么把原数组进行排序呢?

a数组中计数为0的就把它滤掉,就是不存在这个数,然后直到找到有这个数

所以我们可以用一个循环来解决了

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{int n = 0;//自行输入一个数代表数组的元素个数scanf("%d", &n);//VS不支持变长数组,所以我们把这个数组调大一些,以免越界int arr[100] = { 0 };for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}//输入完后开始找最大最小值了int max = arr[0];int min = arr[0];for (int i = 0; i < n; i++){if (max < arr[i])max = arr[i];if (min > arr[i])min = arr[i];}int sub = max - min + 1;//求范围int* p = (int*)calloc(sizeof(int),sub);//判断一下if (p == NULL){perror("calloc");return 1;}//计数for (int i = 0; i < n; i++){p[arr[i] - min]++;}//计数完成后,再对原数组进行重新排序就行了int k = 0;//定义一个k变量对原数组进行输入数字int j = 0;for (j = 0; j < sub; j++){while (p[j]--){arr[k++] = j + min;}}for (int i = 0; i < n; i++){printf("%d ", arr[i]);}free(p);p = NULL;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JMM

JMM 全称: Java Memory Model (Java 内存模式)。 它是一种虚拟机规范, 用于屏蔽掉各种硬件和操作系统的内存访问差异, 以实现 Java 程序在各种平台下都能达到一致的并发效果。 主要规定了以下两点 一个线程如何以及何时可以看到其他线程修改过后的共享变量的值, 即线程之间共享…

I.MX6ULL_Linux_驱动篇(46)linux LCD驱动

LCD 是很常用的一个外设&#xff0c;在Linux 下LCD 的使用更加广泛&#xff0c;在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Linux 下 LCD 驱动简析 Framebuffer 设备 先来回顾一下裸机的时候 LCD 驱动是怎…

一次 k8s 升级,竟然导致滴滴故障 12 小时?

大家好&#xff0c;我是君哥。 前段时间滴滴的故障相信大家都知道了。中断业务 12 小时定级为 P0 级故障一点都不冤。 故障回顾 网上有传言是运维人员升级 k8s 时&#xff0c;本来计划是从 1.12 版本升级到 1.20&#xff0c;但是操作失误选错了版本&#xff0c;操作了集群降级…

2-5、包含多个段的程序

语雀原文链接 文章目录 1、概述2、代码段中使用数据示例1&#xff1a;不指定程序入口示例2&#xff1a;指定程序入口原理梳理 3、在代码段中使用栈例子1例子2 4、数据、代码、栈放入不同的段例子1&#xff1a;end start指定程序入口第一步&#xff1a;设置栈顶第二步&#xff…

Lambda表达式规则,用法

Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&#xff08;有且仅有一个抽象方法&#xff09;的匿名内部类 匿名内部类&#xff1a;(本质是对…

Linux系统编程:进程间通信总结

管道 在Linux中&#xff0c;管道是一种进程间通信方式&#xff0c;它允许一个进程&#xff08;写入端&#xff09;将其输出直接连接到另一个进程&#xff08;读取端&#xff09;的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同。 具体…

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像&#xff0c;因为它受到严格控制&#xff0c;体积小&#xff08;目前不到6 MB&#xff09;&#xff0c;同时仍然是一个完整的Linux发行版。 FR…

win11 powershell conda 激活环境后不显示环境名称

win11 powershell conda 激活环境后不显示环境名称 问题现象解决方法 问题现象 安装 Anaconda 后在 powershell 中激活环境后&#xff0c;命令行前面不显示环境名称 解决方法 在 powershell 中执行 conda init 重新打开 poweshell 出现以下问题&#xff0c;请参考 win11 p…

05-详解调用服务时负载均衡的配置及其原理

负载均衡 负载均衡的原理(通用) LoadBalanced注解用来拦截它所标记的RestTemplate发起的http请求, 底层是利用了一个名为Ribbon的组件来实现负载均衡功能(Cloud高版本已经弃用) LoadBalancerInterceptor的intercept方法会对RestTemplate的请求进行拦截 public class LoadBal…

Java - CAS在Java中的应用、CAS的三大问题

什么是CAS CAS&#xff08;Compare-and-Swap&#xff09;是一种乐观锁的实现方式&#xff0c;全称为“比较并交换”&#xff0c;是一种无锁的原子操作。 在并发编程中&#xff0c;我们都知道i操作是非线程安全的&#xff0c;这是因为 i操作不是原子操作 i语句只需要执行一条指令…

111.am40刷机折腾记4-firefly镜像-dp正常显示

1. 平台&#xff1a; rk3399 am40 4g32g 2. 内核&#xff1a;firefly的内核&#xff08;整体镜像&#xff09; 版本&#xff1a; linux4.4.194 3. 交叉编译工具 &#xff1a;暂时不编译 4. 宿主机&#xff1a;ubuntu18.04 5. 需要的素材和资料&#xff1a;boot-am40-202…

python的Pandas库介绍

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…