Counting Sort算法介绍

65 篇文章 254 订阅
订阅专栏
22 篇文章 1 订阅
订阅专栏

本文主要介绍Counting Sort(计数排序)算法的相关知识,同时通过示例代码介绍这种算法的常见用法。

1 概述

Counting sort是一种基于给定范围数值的排序技术。该算法首先计算给定输入序列(如数组)中每个对象的数量,同时将对象数量值存储在临时数组的对应索引处,最后通过一系列算术操作计算出每个对象在输出序列中的位置。

2 特点

Counting sort算法的特点如下:

  • counting sort会对输入序列进行假设。例如,假设输入序列中的数值范围为0到10,或10到99,等等。某些场景下,counting sort也会假设输入数据为所有实数;
  • counting sort不是一个基于比较的排序算法,它将输入数据散列(hash)到一个临时计数数组中,然后再进行排序;
  • 由于counting sort需要使用临时数组,因此它不是一个原地算法(In-place algorithm)。

一般来说,输入序列取值范围在1到10K之间,都可以考虑使用counting sort算法。

3 常见用法

虽然counting sort是一种排序算法,但是我们可以利用该算法的核心思想来解决一些其他问题。

3.1 存储输入数据中每个元素的出现次数

假设有一组取值范围为0到9的数字,现要求存储每个数字的出现次数。

对于这个问题,就可以使用counting sort思想了。

例如,假设输入序列为:{1, 4, 1, 2, 7, 5, 2},则此问题的解答步骤如下:

1. 新建一个长度为10(因为输入数据的取值范围为0到9)的临时数组,如下图:

2. 统计输入序列的中每个元素的出现次数。元素每出现一次,就根据该元素的值匹配临时数组中对应的索引,然后将该索引对应的数组值(次数值)加1,如下图:

3. 遍历过输入数据后,就可以得到的存储输入数据元素出现次数的临时数组了,如下图:

至此,本问题解答完成。

3.2 Count Number of Pairs With Absolute Difference K

下面通过LeetCode中的一道题,来介绍couting sort的应用。

3.2.1 题目描述

2006. Count Number of Pairs With Absolute Difference K

Given an integer array nums and an integer k, return the number of pairs (i, j) where i < j such that |nums[i] - nums[j]| == k.

The value of |x| is defined as:

x if x >= 0.
-x if x < 0.

Example 1:

Input: nums = [1,2,2,1], k = 1
Output: 4
Explanation: The pairs with an absolute difference of 1 are:
- [1,2,2,1]
- [1,2,2,1]
- [1,2,2,1]
- [1,2,2,1]

Example 2:

Input: nums = [1,3], k = 3
Output: 0
Explanation: There are no pairs with an absolute difference of 3.

Example 3:

Input: nums = [3,2,1,5,4], k = 2
Output: 3
Explanation: The pairs with an absolute difference of 2 are:
- [3,2,1,5,4]
- [3,2,1,5,4]
- [3,2,1,5,4]

Constraints:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100
  • 1 <= k <= 99

3.2.2 解题思路

由于输入数据是一个整型数组,同时存在“1 <= nums[i] <= 100”这条约束,因此可以考虑使用counting sort方法来解决。

先使用counting sort方法来生成一个存储输入数据中每个元素出现次数的临时数组,再根据题目要求,找出临时数组中间距为k的数字对数,该数字对数即为此题答案。

解决方案代码如下:

class Solution {
public:
    int countKDifference(vector<int>& nums, int k) {
        int count = 0;
        vector<int> v(101);
        for (auto i:nums) {
            ++v[i];
        }
        // as 1 <= nums[i]
        for (int i = 1; i + k < v.size(); i++) {
            count += v[i] * v[i + k];
        }

        return count;
    }
};

计数排序JAVA实现counting sort algorithm
05-31
伪代码和算法介绍在此:http://www.algorithmist.com/index.php/Counting_sort,本程序是 根据这个伪代码编写的源代码
计数排序 | Counting Sort
嗅探网的博客
09-08 1494
计数排序是一种基于特定范围之间的键的排序技术。它通过计算具有不同键值(散列类型)的对象的数量来工作,然后做一些算术来计算每个对象在输出序列中的位置。O(n),其中 n 是元素的总数。
十大排序之Counting Sort 计数排序
weixin_39098935的博客
06-29 89
从待排序数组的末尾开始遍历,根据元素的值和辅助计数数组中的累加值确定元素在排序后数组中的位置,并将元素放置到正确的位置。计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于一定范围内的整数排序。计数排序的时间复杂度为O(n + k),其中n是待排序数组的大小,k是待排序数组中元素的范围。计数排序的空间复杂度为O(n + k),其中n是待排序数组的大小,k是待排序数组中元素的范围。对辅助计数数组进行累加操作,以确定每个元素在排序后的数组中的位置。
常用算法(python)
05-08
冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 计数排序(Counting Sort) 基数排序(Radix Sort) 桶排序(Bucket Sort) 深度优先搜索(Depth-First Search, DFS) 广度优先搜索(Breadth-First Search, BFS) 二分查找(Binary Search) 线性查找(Linear Search) 素字符串匹配算法(Naive String Matching) KMP 算法(Knuth-Morris-Pratt) Rabin-Karp 算法 Boyer-Moore 算法 A* 搜索算法 Dijkstra 算法 Bellman-Ford 算法 Floyd-Warshall 算法 Kruskal 算法 Prim 算法 Edmonds-Karp 算法 Ford-Fulkerson 算法
counting-sort-parallel-openmp:与openmp api并行化的计数排序算法
02-22
计数排序并行openmp Esterepositórioabriga实施工具会按顺序对序数进行排序。 Esses algoritmos foram desenvolvidos no Programme da Disciplina deProgramaçãoParalela e Multicore do curso deCiênciadaComputaçãoInstituto Federal CatarinenseCâmpusSul Rio Sul。 从根本上实现了可以立即实现的加速或通过各种方式实现并行化的理想方法。
PHP实现计数排序Counting sort 算法(附完整源码)
最新发布
希望我的博客,能帮上你解决学习中工作中所遇到的问题
04-21 2
PHP实现计数排序Counting sort 算法(附完整源码)
计数排序(Counting Sort
weixin_45987961的博客
11-12 1891
文章目录 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。 算法描述 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数.
十大经典排序算法之计数排序(Counting Sort
派拉斯兔子的博客
12-29 1089
计数排序(Counting Sort) 之前学习的冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序 平均时间复杂度目前最低是 O(nlogn) 计数排序、桶排序、基数排序,都不是基于比较的排序 它们是典型的用空间换时间,在某些时候,平均时间复杂度可以比 O(nlogn)更低 计数排序于1954年由Harold H. Seward提出,适合对一定范围内的整数进行排序 计数排序的核心思想 统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引 (1)计数排序 — 最简单的实现
排序算法-基于C语言实现的排序算法CountingSort实现.zip
03-27
排序算法 排序算法_基于C语言实现的排序算法CountingSort实现
CountingSort:计数排序算法的实现
05-29
麻省理工学院“算法导论”课程中介绍的计数排序算法的实现。 例子 var countingSort = require ( './countingSort.js' ) ; // Construct input [0, 5], therefore an array of size 6 is needed // for the ...
AlgorithmMan by Iori(Counting Sort
08-13
CountingSort为AlgorithmMan中的计数排序演示工具(这是可执行文件;需要.net 4.0支持;非源代码)。 原文:C#算法设计排序篇之08-计数排序(附带动画演示程序) 链接:...
排序算法8-计数排序
Edidaughter的博客
10-28 176
1.什么是计数排序 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中.作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 2.计数排序的步骤 ...
排序和查找-计数排序(Counting Sort
各种问题卡住我
05-06 922
转载自基数排序(Radix Sorting)0 前言常见的非比较排序算法:计数排序,基数排序,桶排序;平均时间复杂度都是O(n),但是限制比较多比较算法的时间复杂度下限为O(nlogn)1 思路输入的元素使n个0到k之间的整数时,时间复杂度为Θ(n+k)\Theta(n+k)由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围
typedef介绍
热门推荐
liitdar的博客
08-21 31万+
本文介绍typedef的用法。 1. 概述 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 typedef本身是一种存储类的关键字,与auto、extern、static、register等关键字不能出现在同一个表达式中。 2. 作用及用法 2.1 typedef的用法 使用......
C++中的string类用法简介
liitdar的博客
08-21 30万+
string是C++标准库的一个重要的部分,主要用于字符串处理。可以使用输入输出流方式直接进行string操作,也可以通过文件等手段进行string操作。同时,C++算法库对string类也有着很好的支持,并且string类还和c语言的字符串之间有着良好的接口。
C++编程语言中stringstream类介绍
liitdar的博客
09-10 22万+
本文主要介绍 C++ 编程语言中 stringstream 类的相关知识,同时通过示例代码介绍 stringstream 类的使用方法。 1 概述 <sstream> 定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。本文以 stringstream 为主,介绍流的输入和输出操作。 <sstream> 主要用来进行数据类型转换,由于 <sstream> 使用 string 对
C++编程语言中重载运算符(operator)介绍
liitdar的博客
06-11 19万+
operator是 C++ 的一个关键字,它和运算符(如“=”)一起使用,表示一个运算符重载函数,在理解时可将 operator 和待重载的运算符整体(如“operator=”)视为一个函数名。使用 operator 重载运算符,是 C++扩展运算符功能的方法。使重载后的运算符的使用方法与重载前一致;扩展运算符的功能只能通过函数的方式实现。(实际上,C++ 中各种“功能”都是通过函数实现的)
C++编程语言中赋值运算符重载函数(operator=)介绍
liitdar的博客
06-11 10万+
首先介绍为什么要对赋值运算符“=”进行重载。某些情况下,当我们编写一个类的时候,并不需要为该类重载“=”运算符,因为编译系统为每个类提供了默认的赋值运算符“=”,使用这个默认的赋值运算符操作类对象时,该运算符会把这个类的所有数据成员都进行一次赋值操作。int b;int c;对这个类的对象进行赋值时,使用默认的赋值运算符是没有问题的。int b;int c;
COUNTING-SORT算法
03-28
COUNTING-SORT算法是一种稳定的排序算法,它的时间复杂度为O(n+k),其中n为待排序元素的个数,k为待排序元素中的最大值。 算法步骤: 1. 找出待排序元素中的最大值max,创建一个长度为max+1的计数数组count,并将每个元素的计数都初始化为0。 2. 遍历待排序数组,将每个元素在计数数组中对应的位置上加1。 3. 遍历计数数组,将每个元素的值更新为前一个元素的值加上当前元素的值。 4. 从待排序数组的末尾开始遍历,将每个元素在计数数组中对应的位置上的值减1,并将其放到排序数组的相应位置上。 5. 待排序数组就被排序完成了。 COUNTING-SORT算法的优点是具有线性时间复杂度,适用于排序范围比较小的数列。缺点是需要额外的存储空间,且只适用于非负整数排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • typedef介绍 311202
  • C++中的string类用法简介 308795
  • C++编程语言中stringstream类介绍 222116
  • C++编程语言中重载运算符(operator)介绍 198867
  • C++编程语言中赋值运算符重载函数(operator=)介绍 109281

分类专栏

  • 信息安全 8篇
  • Qt 4篇
  • 实用技巧 3篇
  • 视音频 7篇
  • 流媒体 7篇
  • 网络通信 8篇
  • 硬件设备 2篇
  • RPC 7篇
  • C/C++编程语言 65篇
  • 指针 3篇
  • 数据结构与算法 22篇
  • 计算机操作系统 6篇
  • NGINX 3篇
  • 杂项 1篇
  • 常用工具和软件 44篇
  • CGI 2篇
  • Linux操作系统 31篇
  • 计算机网络 21篇
  • 数据库 19篇
  • Windows 9篇
  • 计算机理论知识 2篇
  • 多线程
  • Python编程语言 2篇
  • 设计模式 1篇
  • 高并发 1篇
  • 互联网技术 6篇

最新评论

  • C++编程语言中赋值运算符重载函数(operator=)介绍

    比较相等永远只写一个等号!: vs也是,请问为什么要这样写呢?

  • C++编程语言中赋值运算符重载函数(operator=)介绍

    比较相等永远只写一个等号!: 为什么呢

  • SQL中自增(AUTO_INCREMENT)字段介绍

    CSDN-Ada助手: 大数据开发 Python 和 Java 哪个强?

  • 进程(process)和线程(thread)介绍

    CSDN-Ada助手: 如何在 Linux 上安装 MySQL 数据库?

  • C/C++编程语言中操作目录及目录中文件的方法

    CSDN-Ada助手: C语言中如何使用递归函数?

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • “3Sum”类问题总结
  • C++编程语言STL只begin和end函数介绍
  • C++编程语言STL之sort函数介绍
2023年13篇
2022年15篇
2021年17篇
2020年4篇
2019年88篇
2018年62篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liitdar

赠人玫瑰,手有余香,君与吾共勉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司咸阳网站seo优化报价诸城高端网站设计哪家好南京营销网站拉萨优化公司拉萨关键词按天计费哪家好随州设计网站哪家好天门网站改版推荐肇庆网站优化按天扣费天门高端网站设计价格嘉兴企业网站设计多少钱南昌SEO按天计费推荐枣庄建网站价格聊城模板网站建设推荐坑梓阿里店铺运营哪家好芜湖网站排名优化报价周口网站推广系统报价新乡百度网站优化排名多少钱太原网站制作设计推荐保山百度标王多少钱新余百度关键词包年推广吉安百姓网标王公司大连网站制作多少钱襄樊至尊标王大同网站改版价格同乐阿里店铺托管推荐迁安企业网站制作推荐内江网站开发公司达州网站排名优化价格丽江如何制作网站公司福永外贸网站制作公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化