counting sort 的管窥

2023-11-08 20:40
文章标签 counting sort 管窥

本文主要是介绍counting sort 的管窥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘自wikipedia:
count sort 计数排序 稳定的线性时间排序法
计数排序不是比较排序,排序的速度快于任何比较排序算法。
统计出有多少元素小于或等于某一个元素,也就知道该元素的正确得位置。
1.定新数组大小——找出待排序的数组中最大和最小的元素
2.统计次数——统计数组中每个值为i的元素出现的次数,存入新数组C的第i项
3.对统计次数逐个累加——对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4.反向填充目标数组——将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

分类 排序算法
数据结构 数组
最坏时间复杂度 O(n+k)
最优时间复杂度 O(n+k)
平均时间复杂度 O(n+k)

计数排序是不存在比较和交换等一般排序的思想,而是如同”萝卜占坑“的样子。

在这里插入图片描述
将数列中最大数和最小数差值构建从最达到最小的长度序列,然后统计各个数字的个数,并根据下标和数字的个数进行从小到大进行扩充。
分析:这种排序不存在比较和交换,只需要根据统计的数字个数进行从低到高的排序就行了。所以,时间复杂度是线性的递增,但是空渐渐复杂度趋势较高,但是排序算法是稳定的。

下面是python3的计数排序算法代码:`

def counting_sort(collection):# 待排序数列的长度length = len(collection)# 获得待排序数列的最大值和最小值,并构建相应的计数数列coll_max = max(collection)coll_min = min(collection)calc_list = [0]*(coll_max+1-coll_min)# 将相应的数字的个数统计记录在统计数字个数列表中for num in collection:calc_list[num] += 1output_list = []# 将数字的个数和其表示数字的下标进行扩充有序的数列for i in range(len(calc_list)):while calc_list[i]:output_list.append(i)calc_list[i] -= 1return output_listif __name__ == "__main__":user_input = input('Enter numbers separated by a comma:\n').strip()unsorted = [int(item) for item in user_input.split(',')]print(counting_sort(unsorted))

同时关于计数排序方法还有其他的方式解决,但是主要思想都是基于这样的思想。

这篇关于counting sort 的管窥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372382

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

POJ 2386 Lake Counting(DFS)

题目: http://poj.org/problem?id=2386 题解: 遍历一次,遇到w,一次DFS后,与此w连接的所有w都被替换成‘ . ’,直到遍历完图中不再存在w为止,总共进行DFS的次数就是答案了。 代码: #include<stdio.h>int N,M;char map[110][110];void dfs(int x,int y){map[x][y]='

C/C++经典排序问题,sort函数使用

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 大家在学习C语言的时候,是不是经常被排序算法折磨的很难那首,其实都是但是在C++中有专门的,排序函数,而且支持自定义排序算法。下面我就带大家看看,sort函数简单的数组排序中的应用。 2. 正文 2.1 问题 题目描述

Hive中order by,sort by,distribute by,cluster by的区别

一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。关于order by的详细介绍请参考这篇文章:Hive Order by操作。 二:sort by sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort

[LeetCode] 338. Counting Bits

题:https://leetcode.com/problems/counting-bits/description/ 题目 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary repres

《Zero-Shot Object Counting》CVPR2023

摘要 论文提出了一种新的计数设置,称为零样本对象计数(Zero-Shot Object Counting, ZSC),旨在测试时对任意类别的对象实例进行计数,而只需在测试时提供类别名称。现有的类无关计数方法需要人类标注的示例作为输入,这在许多实际应用中是不切实际的。ZSC方法不依赖于人类标注者,可以自动操作。研究者们提出了一种方法,可以从类别名称开始,准确识别出最佳的图像块(patches),用

list.sort实现根据对象的属性值对集合进行排序

list.sort实现根据对象的属性值对集合进行排序,如下所示List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map1 = new HashMap<>();map1.put("gz_id",1);map1.put("aaa","aaa");Map<String,Object> map2 = new H

HDU 1890 Robotic Sort

题意: 将一列数字排序  排序规则是  每次找到最小值的位置loc  将1~loc所有数字颠倒  然后删掉第一位  直到排好序  排序要求是稳定的 思路: 这题要做的是  寻找区间最小值位置  翻转区间  的操作  因此可以想到用splay 只需要每个节点记录一个small  就可以实现找到最小值位置 翻转区间操作就是将splay的超级头转到最上面使之成为根  再把loc转到根下面

Go-Sort(Cont)

倒序。 package mainimport ("fmt""sort")func main() {data := []string{"one", "two", "three", "four"}sort.Strings(data)fmt.Println(data) //[four one three two]sort.Sort(sort.Reverse(sort.StringSlice(data