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

排序算法 -计数排序

文章目录

  • 1. 计数排序(Counting Sort)
    • 1.1 简介
    • 1.2 计数排序的步骤
    • 1.3 计数排序C语言实现
      • 注释说明:
    • 1.4 时间复杂度
    • 1.5 空间复杂度

1. 计数排序(Counting Sort)

1.1 简介

计数排序(Counting Sort)是一种非比较型整数排序算法,适用于一定范围内的整数排序。它的基本思想是通过计数来确定每个元素在排序后数组中的位置,从而实现排序。计数排序的时间复杂度为 O(n + k),其中 n 是待排序数组的元素个数,k 是待排序元素的取值范围。

1.2 计数排序的步骤

计数排序(Counting Sort)是一种非比较型整数排序算法,适用于一定范围内的整数排序。它的基本思想是通过计数来确定每个元素在排序后数组中的位置,从而实现排序。计数排序的时间复杂度为 O(n + k),其中 n 是待排序数组的元素个数,k 是待排序元素的取值范围。

  1. 找出待排序数组中的最大值和最小值,以确定元素的取值范围。
  2. 创建一个计数数组,其大小为最大值与最小值之差加一(因为包含边界值)。
  3. 遍历待排序数组,统计每个元素出现的次数,并将结果存储在计数数组中。
  4. 计算前缀和,以确定每个元素在排序后数组中的位置。
  5. 创建输出数组,根据计数数组中的信息将元素放入正确的位置。

1.3 计数排序C语言实现

#include <stdio.h>
#include <stdlib.h>// 计数排序函数
void CountSort(int* a, int n) {// 初始化最大值和最小值为数组的第一个元素int max = a[0], min = a[0];// 遍历数组,找到最大值和最小值for (int i = 1; i < n; i++) { // 注意这里从1开始,因为第一个元素已经用于初始化if (a[i] > max)max = a[i]; // 更新最大值if (a[i] < min)min = a[i]; // 更新最小值}// 计算计数数组的大小,并动态分配内存int range = max - min + 1;int* count = (int*)malloc(range * sizeof(int));if (count == NULL) {// 内存分配失败处理(这里简单处理为退出程序,实际应用中可能需要更复杂的错误处理)fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}// 初始化计数数组为0for (int i = 0; i < range; i++) {count[i] = 0;}// 统计每个元素出现的次数for (int i = 0; i < n; i++) {count[a[i] - min]++; // 使用元素值减去最小值作为计数数组的下标}// 重建排序后的数组int* output = (int*)malloc(n * sizeof(int));if (output == NULL) {// 内存分配失败处理free(count); // 释放已经分配的内存fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}int index = 0; // 用于填充输出数组的索引for (int i = 0; i < range; i++) {// 对于每个在计数数组中出现的元素,将其填充到输出数组中while (count[i] > 0) {output[index] = i + min;index++;count[i]--;}}// 将排序后的数组复制回原数组for (int i = 0; i < n; i++) {a[i] = output[i];}// 释放动态分配的内存free(count);free(output);
}// 主函数,用于测试计数排序
int main() {int arr[] = {4, 2, 2, 8, 3, 3, 1};int n = sizeof(arr) / sizeof(arr[0]);// 调用计数排序函数CountSort(arr, n);// 打印排序后的数组for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

注释说明:

  1. 初始化最大值和最小值

    • 将数组的第一个元素赋值给最大值 max 和最小值 min
  2. 找到最大值和最小值

    • 遍历数组(从第二个元素开始,因为第一个元素已经用于初始化),更新最大值和最小值。
  3. 动态分配计数数组

    • 根据最大值和最小值计算计数数组的大小(范围),并动态分配内存。
    • 检查内存分配是否成功,如果失败则处理错误(这里简单处理为退出程序)。
    • 初始化计数数组为0。
  4. 统计每个元素出现的次数

    • 遍历输入数组,使用元素值减去最小值作为计数数组的下标,统计每个元素的出现次数。
  5. 重建排序后的数组

    • 动态分配一个大小为 n 的输出数组。
    • 使用两个循环:外循环遍历计数数组,内循环(while 循环)根据计数数组的值将元素填充到输出数组中。
    • 注意,这里我们没有显式地计算前缀和,而是直接在填充输出数组时减少了计数数组的值。
  6. 将排序后的数组复制回原数组

    • 遍历输出数组,将排序后的元素复制回原数组。
  7. 释放内存

    • 释放计数数组和输出数组所占用的内存。
  8. 主函数

    • 初始化一个待排序的数组。
    • 调用计数排序函数。
    • 打印排序后的数组。

计数排序(Counting Sort)的时间复杂度和空间复杂度分析如下:

1.4 时间复杂度

  1. 查找最大值和最小值

    • 需要遍历整个数组一次,因此时间复杂度为 O ( n ) O(n) O(n)
  2. 初始化计数数组并统计元素出现次数

    • 初始化计数数组的时间复杂度为 O ( k ) O(k) O(k),其中 k k k 是计数数组的大小(即输入数组中的最大值与最小值之差加一)。
    • 遍历输入数组并统计元素出现次数的时间复杂度为 O ( n ) O(n) O(n)
  3. 重建排序后的数组

    • 遍历计数数组并根据其值填充输出数组的时间复杂度为 O ( n + k ) O(n + k) O(n+k),但在最坏情况下(即所有元素都相同或非常接近时),这仍然可以看作是 O ( n ) O(n) O(n),因为 k k k 是由输入数据决定的,并且通常远小于 n n n 的数量级时,我们可以忽略 k k k 对时间复杂度的影响(但这取决于具体情况,如果 k k k n n n 相近,则不能忽略)。

综上所述,计数排序的总时间复杂度在 O ( n + k ) O(n + k) O(n+k),其中 n n n 是输入数组的大小, k k k 是输入数据的范围(最大值与最小值之差加一)。在输入数据范围较小的情况下,计数排序是非常高效的。

1.5 空间复杂度

  • 计数数组:需要额外一个大小为 k k k 的数组来存储每个元素的出现次数。
  • 输出数组(如果单独分配):在重建排序后的数组时,如果分配了一个单独的输出数组,则需要额外的 n n n 个空间。但如前所述,这可以通过直接在原数组上重建来避免。

相关文章:

排序算法 -计数排序

文章目录 1. 计数排序&#xff08;Counting Sort&#xff09;1.1 简介1.2 计数排序的步骤1.3 计数排序C语言实现注释说明&#xff1a; 1.4 时间复杂度1.5 空间复杂度 1. 计数排序&#xff08;Counting Sort&#xff09; 1.1 简介 计数排序&#xff08;Counting Sort&#xff…...

Java学习,基本数据类型

变量就是申请内存来存储值&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。Java 提供了八种基本数据类型&#xff0c;这些类型可以分为四大类&#xff1a;整数类型…...

单片机GPIO中断+定时器 软件串口通信

单片机GPIO中断定时器 软件串口通信 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us&#xff1b; 定时器第一次定时时间设为52us即半个bit的时间&#xff0c;其目的是偏移半个bit时间&#xff0c;之后的每104us采样并读取1bit数据。使得采样…...

elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明

前言 在使用el-table 表格中有些表格的表头需要加入一些提示&#xff0c;鼠标移入则出现提示&#xff0c;非常实用&#xff0c;我是通过el-table中的el-tooltip实现的&#xff0c;以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…...

NVR小程序接入平台/设备EasyNVR多个NVR同时管理设备接入:海康NVR 3.0提示不在线如何处理?

在视频监控领域&#xff0c;设备的兼容性和互操作性一直是用户关注的重点。海康NVR管理平台EasyNVR作为一款轻量级的视频监控平台&#xff0c;凭借其强大的兼容性、可扩展性和丰富的功能&#xff0c;成为了公共安全领域“云平台”解决方案的杰出代表。然而&#xff0c;在实际应…...

datawhale11月组队学习 模型压缩技术2:PyTorch模型剪枝教程

文章目录 一、 prune模块简介1.1 常用方法1.2 剪枝效果1.3 二、三、四章剪枝测试总结 二、局部剪枝&#xff08;Local Pruning&#xff09;2.1 结构化剪枝2.1.1 对weight进行随机结构化剪枝&#xff08;random_structured&#xff09;2.1.2 对weight进行迭代剪枝&#xff08;范…...

SOL链上Meme生态的崛起与未来#Dapp开发#链游#交易所#公链搭建

近年来&#xff0c;随着区块链技术的普及和NFT文化的流行&#xff0c;meme&#xff08;网络迷因&#xff09;逐渐成为区块链生态中的重要组成部分。meme不仅是一种互联网文化符号&#xff0c;更逐步渗透进了去中心化金融&#xff08;DeFi&#xff09;、NFT和元宇宙等多个领域&a…...

部署Apache Doris

官方文档&#xff1a;https://doris.apache.org/zh-CN/installing/compilation.html 一、编译 使用 Docker 开发镜像编译&#xff08;推荐&#xff09; 1.拉取镜像 #下载 Docker 最新主干版本代码&#xff0c;会随主干版本不断更新。 $ docker pull apache/incubator-doris:…...

ElasticSearch-全文检索(一)基本介绍

简介 Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic 全文搜索属于最常见的需求&#xff0c;开源的Elasticsearch是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github都采用它 Elastic的底层是开源库Lucene。但…...

paramiko 库实现的暴力破解 SSH 密码

import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量&#xff0c;可根据实际情况调整&#xff0c;适当减小可降低对目标服务器的压力以及减少多线程同步问题出…...

Python 操作 Elasticsearch 全指南:从连接到数据查询与处理

文章目录 Python 操作 Elasticsearch 全指南&#xff1a;从连接到数据查询与处理引言安装 elasticsearch-py连接到 Elasticsearch创建索引插入数据查询数据1. 简单查询2. 布尔查询 更新文档删除文档和索引删除文档删除索引 批量插入数据处理分页结果总结 Python 操作 Elasticse…...

Jarvis March算法详解及Python实现(附设计模式案例)

目录 Jarvis March算法详解及Python实现(附设计模式案例)第一部分:Jarvis March算法概述与原理1.1 什么是Jarvis March算法?1.2 算法原理1.3 算法流程1.4 时间复杂度第二部分:Jarvis March算法的Python实现(面向对象设计)2.1 面向对象设计2.2 代码实现2.3 代码解释第三部…...

AIGC中的文本风格迁移:基于深度学习的实现

引言 文本风格迁移是自然语言处理领域的一个重要研究方向&#xff0c;它可以将文本从一种风格转换为另一种风格&#xff0c;同时保留其原有的内容。随着深度学习技术的发展&#xff0c;文本风格迁移的方法变得越来越先进和高效。本文将探讨基于序列到序列模型&#xff08;Seq2…...

丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …...

响应“一机两用”政策 落实政务外网安全

在数字化时代&#xff0c;政务办公外网安全的重要性日益凸显&#xff0c;特别是在“一机两用”的背景下&#xff0c;即同一台终端既要处理政务内网的数据&#xff0c;又要访问互联网&#xff0c;这对网络安全提出了更高的要求。深信达SPN安全上网方案&#xff0c;即反向沙箱技术…...

通过JS删除当前域名中的全部COOKIE教程

有时候需要通过JS来控制一下网站的登录状态&#xff0c;就例如:网站登出功能&#xff0c;我们可以直接通过JS将所有COOKIE删除&#xff0c;COOKIE删除之后&#xff0c;网站自然也就退出了。 那么今天我就给大家分享一段JS的函数&#xff0c;通过调用这段函数就可以实现删除COO…...

Flutter:Widget生命周期

StatelessWidget&#xff1a;无状态部件的生命周期 import package:flutter/material.dart;void main() {runApp(App()); }class App extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomePage(title: MyHome),);} }class M…...

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…...

[⑧5G NR]: PBCH payload生成

本篇博客记录下5G PBCH信道中payload数据的生成方式。PBCH payload一共32个比特&#xff0c;基本结构如下图&#xff1a; 根据SSB PDU中bchPayloadFlag的值有三种方式得到PBCH payload。 bchPayloadFlag 0&#xff1a;全部32比特由MAC层提供。 bchPayloadFlag 1&#xff1a;M…...

查看解决端口占用,以及docker解决端口占用的原理

在软件开发和部署过程中&#xff0c;端口占用是一个常见的问题。以下是查看和解决端口占用问题的完整解决方案&#xff1a; 一、查看端口占用情况 1. 在 Linux 系统中 方法一&#xff1a;使用 lsof 命令 sudo lsof -i:<端口号>输出信息中会显示占用端口的进程名称、PI…...

终极无人机仿真平台XTDrone:从入门到精通的完整指南

终极无人机仿真平台XTDrone&#xff1a;从入门到精通的完整指南 【免费下载链接】XTDrone UAV Simulation Platform based on PX4, ROS and Gazebo 项目地址: https://gitcode.com/gh_mirrors/xt/XTDrone XTDrone是一款基于PX4飞控、ROS机器人操作系统和Gazebo物理引擎的…...

从零开始将个人小项目的大模型API切换至Taotoken的过程与感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从零开始将个人小项目的大模型API切换至Taotoken的过程与感受 1. 迁移前的项目状态与动机 我维护着一个用于内容摘要和分类的个人…...

workout-cool项目实战:构建自动化运动数据流,打通健康管理与效率工具

1. 项目概述与核心价值 最近在健身圈和开发者社区里&#xff0c;一个叫“workout-cool”的项目热度悄然攀升。乍一看这个标题&#xff0c;你可能会觉得它只是一个简单的健身记录工具&#xff0c;但当你真正深入进去&#xff0c;会发现它远不止于此。作为一个长期在健康科技和效…...

3步掌握天龙八部单机版数据编辑:从游戏管家到创意设计师的蜕变之路

3步掌握天龙八部单机版数据编辑&#xff1a;从游戏管家到创意设计师的蜕变之路 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 你是否曾在天龙八部单机版中遇到过这样的困扰&#xff1a;角色成长太慢…...

Hyper-V DDA图形工具:5分钟完成GPU直通的终极指南

Hyper-V DDA图形工具&#xff1a;5分钟完成GPU直通的终极指南 【免费下载链接】DDA 实现Hyper-V离散设备分配功能的图形界面工具。A GUI Tool For Hyper-Vs Discrete Device Assignment(DDA). 项目地址: https://gitcode.com/gh_mirrors/dd/DDA 还在为复杂的Hyper-V离散…...

别再让角色‘走猫步’:深入浅出图解‘拉绳算法’,5步实现游戏平滑寻路

别再让角色‘走猫步’&#xff1a;深入浅出图解‘拉绳算法’&#xff0c;5步实现游戏平滑寻路 你是否曾在游戏中见过角色沿着路径移动时&#xff0c;像模特走猫步一样左右摇摆&#xff1f;这种不自然的运动不仅影响视觉体验&#xff0c;还可能暴露游戏AI的粗糙。本文将用最直观…...

避开这些坑!用AD5934测量从3Ω到100kΩ阻抗的实战经验与校准技巧

避开这些坑&#xff01;用AD5934测量从3Ω到100kΩ阻抗的实战经验与校准技巧 在精密阻抗测量领域&#xff0c;AD5934作为一款高集成度的阻抗转换芯片&#xff0c;凭借其宽频带扫描能力和数字解调技术&#xff0c;成为从生物传感器到材料分析等多个领域的核心器件。但实际应用中…...

NotebookLM与国家智慧教育平台对接全路径(含教育部2024年最新接口规范V2.3解读)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM教育领域应用概览 NotebookLM 是 Google 推出的基于 AI 的笔记增强型研究助手&#xff0c;专为深度阅读、知识整合与教学辅助设计。在教育场景中&#xff0c;它能将教师上传的 PDF 教材、课…...

如何快速上手ESP32物联网开发:Arduino-ESP32终极入门指南

如何快速上手ESP32物联网开发&#xff1a;Arduino-ESP32终极入门指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要开始ESP32物联网开发却不知从何入手&#xff1f;…...

大模型推理全链路拆解

从 token 调度到采样输出&#xff0c;追踪每一步张量维度的变化&#xff0c;搞懂 LLM 推理到底在算什么 01 为什么需要 Continuous Batching 批处理能提升 GPU 利用率——复用权重来均摊显存访问开销。但生成式任务的输出序列长度不可预测且差异巨大&#xff0c;传统"齐…...