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

CSP-J算法基础 计数排序

文章目录

  • 前言
  • 计数排序
    • 计数排序的过程
    • 总结
  • 代码实现计数排序
  • 总结


前言


计数排序

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于范围有限的整数排序。它通过计数每个值出现的次数,依次排列这些值。该算法不通过比较元素大小进行排序,而是根据值的分布情况完成排序。

计数排序的过程

假设我们有一个数组 [4, 2, 2, 8, 3, 3, 1],需要对它进行升序排序。

  1. 初始数组
    [4, 2, 2, 8, 3, 3, 1]

  2. 找到最大值和最小值
    计数数组大小的公式是:

在这里插入图片描述

其中:

  • 最大值 是输入数组中的最大元素;
  • 最小值 是输入数组中的最小元素;
  • 加上 1 是为了包括最大值和最小值之间的所有可能值。

这个公式确保计数数组有足够的空间来记录所有输入数组中可能的整数值的出现次数。

  • 最大值是 8,最小值是 1。因此,计数数组的大小为 8 - 1 + 1 = 8
  1. 构建计数数组

    • 创建一个大小为 8 的计数数组 count,初始时所有值为 0。即:
      [0, 0, 0, 0, 0, 0, 0, 0]
  2. 计算每个元素出现的次数

    • 遍历输入数组,并增加计数数组对应位置的值:
      • 数字 4count[4 - 1]++count 变为 [0, 0, 0, 1, 0, 0, 0, 0]
      • 数字 2count[2 - 1]++count 变为 [0, 1, 0, 1, 0, 0, 0, 0]
      • 数字 2count[2 - 1]++count 变为 [0, 2, 0, 1, 0, 0, 0, 0]
      • 数字 8count[8 - 1]++count 变为 [0, 2, 0, 1, 0, 0, 0, 1]
      • 数字 3count[3 - 1]++count 变为 [0, 2, 1, 1, 0, 0, 0, 1]
      • 数字 3count[3 - 1]++count 变为 [0, 2, 2, 1, 0, 0, 0, 1]
      • 数字 1count[1 - 1]++count 变为 [1, 2, 2, 1, 0, 0, 0, 1]

    现在,计数数组显示了输入数组中每个元素出现的次数:
    [1, 2, 2, 1, 0, 0, 0, 1]

  3. 累加计数数组

    • 修改计数数组,使其变成累计计数数组。这表示每个数字应当出现在最终数组中的位置:
      • count[1] = count[0] + count[1][1, 3, 2, 1, 0, 0, 0, 1]
      • count[2] = count[1] + count[2][1, 3, 5, 1, 0, 0, 0, 1]
      • count[3] = count[2] + count[3][1, 3, 5, 6, 0, 0, 0, 1]
      • count[4] = count[3] + count[4][1, 3, 5, 6, 6, 0, 0, 1]
      • count[5] = count[4] + count[5][1, 3, 5, 6, 6, 6, 0, 1]
      • count[6] = count[5] + count[6][1, 3, 5, 6, 6, 6, 6, 1]
      • count[7] = count[6] + count[7][1, 3, 5, 6, 6, 6, 6, 7]

    累加后的计数数组为:
    [1, 3, 5, 6, 6, 6, 6, 7]

  4. 构建排序后的数组

    • 使用计数数组将输入数组中的每个元素放到正确的位置:
      • 数字 1count[1 - 1]--,将 1 放入排序后的数组第 0 位。数组变为 [1, _, _, _, _, _, _]
      • 数字 2count[2 - 1]--,将 2 放入排序后的数组第 2 位。数组变为 [1, _, 2, _, _, _, _]
      • 数字 2count[2 - 1]--,将 2 放入排序后的数组第 1 位。数组变为 [1, 2, 2, _, _, _, _]
      • 数字 3count[3 - 1]--,将 3 放入排序后的数组第 4 位。数组变为 [1, 2, 2, _, 3, _, _]
      • 数字 3count[3 - 1]--,将 3 放入排序后的数组第 3 位。数组变为 [1, 2, 2, 3, 3, _, _]
      • 数字 4count[4 - 1]--,将 4 放入排序后的数组第 5 位。数组变为 [1, 2, 2, 3, 3, 4, _]
      • 数字 8count[8 - 1]--,将 8 放入排序后的数组第 6 位。数组变为 [1, 2, 2, 3, 3, 4, 8]
  5. 最终结果

    • 输入数组 [4, 2, 2, 8, 3, 3, 1] 被排序为 [1, 2, 2, 3, 3, 4, 8]

总结

计数排序通过创建一个计数数组来记录每个元素出现的次数,然后使用这些计数信息将元素放置在正确的位置。这个算法的时间复杂度是 O(n+k),其中 n 是输入数据的大小,k 是数据的取值范围。对于元素范围较小且数据量大的情况,计数排序表现非常出色。然而,当数据范围较大时,计数排序的空间复杂度较高,使用效果可能不理想。

代码实现计数排序

#include <stdio.h>
#include <stdlib.h>// 计数排序函数
void countingSort(int arr[], int n) {int i, max = arr[0], min = arr[0];// 找到数组中的最大值和最小值for (i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}printf("最大值: %d, 最小值: %d\n", max, min);// 计算计数数组的大小int range = max - min + 1;int *count = (int *)calloc(range, sizeof(int));  // 动态分配内存并初始化为0// 计算每个元素出现的次数for (i = 0; i < n; i++) {count[arr[i] - min]++;}// 打印计数数组printf("计数数组:\n");for (i = 0; i < range; i++) {printf("%d ", count[i]);}printf("\n");// 将计数数组累加,调整为位置索引for (i = 1; i < range; i++) {count[i] += count[i - 1];}// 打印累加后的计数数组printf("累加后的计数数组:\n");for (i = 0; i < range; i++) {printf("%d ", count[i]);}printf("\n");// 创建输出数组int *output = (int *)malloc(n * sizeof(int));// 按照计数数组的值,构建排序后的数组//从后向前遍历排序 for (i = n - 1; i >= 0; i--) {output[count[arr[i] - min] - 1] = arr[i];count[arr[i] - min]--;  // 更新计数数组}// 打印排序后的数组printf("排序后的数组:\n");for (i = 0; i < n; i++) {arr[i] = output[i];printf("%d ", arr[i]);}printf("\n");// 释放动态分配的内存free(count);free(output);
}int main() {int arr[] = {5, 2, 2, 8, 3, 3, 1};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:\n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");// 调用计数排序countingSort(arr, n);return 0;
}

总结

相关文章:

CSP-J算法基础 计数排序

文章目录 前言计数排序计数排序的过程总结 代码实现计数排序总结 前言 计数排序 计数排序&#xff08;Counting Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;适用于范围有限的整数排序。它通过计数每个值出现的次数&#xff0c;依次排列这些值。该算法不通过比…...

Java泛型类型解析

解析泛型类型 获取字段泛型类型 **java.lang.reflect.Field#getGenericType**: 作用&#xff1a;返回字段的泛型类型。返回类型&#xff1a;Type。如果字段是一个泛型类型&#xff0c;这个方法将返回一个表示这个泛型类型的 Type 对象&#xff0c;比如 ParameterizedType&…...

EasyExcel 学习之 导出 “类型及精度问题”

目录 现象缘由类型问题精度/格式问题精度问题格式问题 解决 现象 Excel 导出时&#xff0c;可能面临几个问题&#xff1a; 类型问题&#xff1a;常见类型转换、URL 转图片等精度/格式问题&#xff1a;数字、日期转换 缘由 类型问题 Excel 常见的 API 有两种&#xff0c;Ea…...

从视频中每隔10帧截取一帧并保存为图片

要从视频中每隔10帧截取一帧并保存为图片&#xff0c;可以使用 OpenCV 库。 import cv2# 视频文件的路径 video_path path/to/your/video.mp4# 创建一个 VideoCapture 对象 cap cv2.VideoCapture(video_path)# 检查是否成功打开视频文件 if not cap.isOpened():print("E…...

防火墙、firewalld指令、更改yum源为阿里云的yum源及常见问题

一、防火墙分类 1、硬件防火墙 2、软件防火墙&#xff08;咱们昨天学的就属于这个&#xff09; 3、waf 4、下一代防火墙 二、工作原理 1、通过对进出口数据的&#xff08;数据、端口、IP等&#xff09;进行过滤&#xff0c;达到对内网数据的保护。 2、防护危险的一堵墙、…...

5G Multicast/Broadcast Services(MBS) (二) Multicast

这篇是Multicast handling的overview,正文开始。 值得注意的是,对于5MBS multicast,UE只有处于 RRC connected和Inactive时,网络侧才可以 通过MRB将MBS multicast数据传输到 UE;处于Idle态只能进行MBS broadcast过程。 对于multicast涉及的RN...

【计算机方向】中科院二区潜力刊!最快14天accept,还是非OA ,不能错过!

期刊解析 &#x1f6a9;本 期 期 刊 看 点 &#x1f6a9; 非OA 审稿友好&#xff0c;审稿速度快 自引率7.9% 今天小编带来计算机领域SCI快刊的解读&#xff01; 如有相关领域作者有意投稿&#xff0c;可作为重点关注&#xff01; 01 期刊信息✦ 期刊名称&#xff1a;Inter…...

合适做项目交付的物联网平台:ThingsKit

ThingsKit&#xff0c;作为一个专为项目交付设计的物联网平台&#xff0c;凭借其强大的功能和灵活性&#xff0c;成为了众多企业的首选。 一、ThingsKit的核心优势 模块化设计&#xff1a;ThingsKit采用模块化设计&#xff0c;使得用户可以根据自己的需求灵活选择和组合不同的…...

python绘制3D瀑布图

成品&#xff1a; 代码&#xff1a; def line_3d(x, y, z, x_label_indexs):"""在y轴的每个点&#xff0c;向x轴的方向延伸出一个折线面&#xff1a;展示每个变量的时序变化。x: x轴&#xff0c;时间维&#xff0c;右边。y: y轴&#xff0c;变量维&#xff0c;…...

ArcGIS中怎么合并多个点图层并删除重复点?

最近&#xff0c;我接到了一个怎么合并多个点图层并删除其中的重复点的咨询。 下面是我对这个问题的解决思路&#xff1a; 1、合并图层 在地理处理工具里面 选择合并 并设置好要合并的图层即可 2、接下来在 数据管理工具→常规→删除相同项 即可 希望这些建议能对大家有所帮…...

【vue、UI】使用 Vue2 和 Element UI 封装 CSV 文件上传组件,实现csv回显

文章目录 前言组件功能概述实现效果组件模板结构组件的核心逻辑1.数据属性定义2.方法拆解3.CSV 文件解析方法4. 错误处理方法 组件样式完整组件代码总结待优化的地方 前言 在 Vue2 项目中&#xff0c;我们经常需要封装一些可重用的组件来提升开发效率。本文将介绍如何使用 Vue…...

erlang学习: Mnesia Erlang数据库2

Mnesia数据库增加与查询学习 -module(test_mnesia).-record(shop, {item, quantity, cost}). -record(cost, {name, price}). -record(design, {info, plan}). %% API -export([insert/3,select/1,start/0]). start() ->mnesia:start().insert(Name, Quantity, Cost) ->…...

电脑文件怎么备份?推荐6个高效便捷的文件备份的方法

在日常使用电脑的过程中&#xff0c;数据备份是一项至关重要的任务。无论是个人用户还是企业用户&#xff0c;都需要确保重要文件的安全性和可恢复性。 以下是推荐的六个高效便捷的文件备份方法&#xff0c;帮助你轻松守住你的文档安全。 1. 使用USB存储设备 USB存储设备如U盘…...

Procdump抓ToDesk密码

目录 前言 1.工具教程 2.转储数据 3.密码获取 4.总结 前言 本文是因为在公众号上看到一篇文章随想着实战中利用ToDesk秀操作失败后&#xff0c;实验环境成功复现后写下。ProcDump[1] 是一个命令行实用工具&#xff0c;其主要用途是监视应用程序的 CPU 峰值&#xff0c;并在…...

ESP8266下载固件→连接阿里云

一、工具准备 1、ESP8266Wifi模块 2、ESP8266下载器 ESP8266-01模块 二、固件配置 CH340串口工具-烧录ESP8266-01固件_esp8266 ch340烧录-CSDN博客文章浏览阅读444次&#xff0c;点赞6次&#xff0c;收藏3次。CH340会有供电不足的问题&#xff0c;因此需要外部供电_esp…...

20240911软考架构-------软考156-160答案解析

每日打卡题156-160答案 156、NoSQL整体框架分为4层&#xff0c;由下至上分为数据持久层、数据分布层、数据逻辑模型层和&#xff08;1&#xff09;。&#xff08;2&#xff09;定义了数据的存储形式。&#xff08;3&#xff09;定义了数据是如何分布的。&#xff08;4&#xf…...

工厂模式与策略模式(golang示例)

一、工厂模式简介 工厂模式是一种创建型设计模式&#xff0c;主要用于封装对象的创建过程。通过使用工厂模式&#xff0c;客户端代码无需直接实例化对象&#xff0c;而是通过工厂类来创建对象。这样可以将对象的创建与使用分离&#xff0c;从而提高代码的灵活性。 1.1 工厂模…...

批量视频如何做成一个二维码(分步骤教程)

原创教程&#xff0c;阿酷TONY&#xff0c;2024.9.11&#xff0c;湖南长沙 批量视频如何做成一个二维码&#xff08;分步骤教程&#xff09;&#xff0c;场景应用&#xff1a; 1. 一批视频需要按组分类&#xff0c;生成一个二维码&#xff0c;实现扫一个二维码&#xff0c;观看…...

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程&#xff1a;learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…...

【单片机开发】单片机常用开发工具

【前言】 在嵌入式系统领域&#xff0c;单片机&#xff08;Microcontroller, MCU&#xff09;作为核心组件&#xff0c;广泛应用于智能家居、工业控制、汽车电子等众多领域。而单片机开发工具&#xff0c;则是开发者们实现创意、解决问题的重要助手。本文主要讲述目前主流的单…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...