python实现计数排序】的更多相关文章

一.计数排序 概要: 时间复杂度O(n),空间复杂度O(k),k是输入序列的值的范围(最大值-最小值),是稳定的.计数排序一般用于已知输入值的范围相对较小,比如给公司员工的身高体重信息排序. 思路: 输入数组A为{3,5,1,2,4,3},值的范围是1~5,所以创建5个桶,序号1,2,3,4,5.装桶时遍历一遍输入数组,A[0]=3,把它放到3号桶:A[1]=5,放到5号桶:1放到1号桶……最后3放到3号桶.现在三号桶的值为2,其他桶的值为1,再遍历一遍桶数组,按顺序把桶倒出,元素被倒出的顺序就…
计数排序有局限性,最小值和最大值决定着数组的长度,如果分配均匀的话可以用 # @File: count_sort import random def count_sort(li, max_num=100): count = [0 for i in range(max_num + 1)] for val in li: count[val] += 1 li.clear() for i in range(len(count)): # i这个数出现了count[i]次 # li.extend([i]*c…
计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 此时数组中已经记录好每个值的数量,自然也就是有序的了 例如: 计数排序实现 下面为列表的计数排序 def count_sort(s): """计数排序""" # 找到最大最小值 min_num = min(s) max_num = max(s) #…
计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到它在最终输出数组中的特定位置上. 通俗地理解,例如有10个年龄不同的人,统计出有8个人的年龄比A小,那A的年龄就排在第9位,用这个方法可以得到其他每个人的位置,也就排好了序. 当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去1的原因.算法的步…
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然后遍历数组A,读入Ai时,S[Ai]增一.所有输入被读进后,扫描数组S得出排好序的表.该算法时间花费O(M+N),空间上不能原地排序. 初始化序列S 遍历A修改序列S的项 举个例子,排序一个数组[5,3,6,1,2,7,5,10] 值都在1-10之间,建立10个桶: [0 0 0 0 0 0 0 0…
old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)): new[old[i]] = new[old[i]] + 1 for i in range(len(new)): for j in range(new[i]): print i 计数排序假设被排序的内容是整数,并且在一个比较小的范围内. 计数排序的时间复杂度 O(N).…
话说,一口气不能吃个胖子, 一次性 学习 计数排序, 也确实容易消化不良. 下面,我们逐步学习下计数排序. 1.  已知一个简单列表 l1 = [5, 4, 3], 分析下这个列表的情况 5 > 4,  5 > 3,  所以 5 比列表中其他数大 的次数,  是  2 4 > 3,  4 < 5,   所以 4 比列表中其他数大 的次数,  是  1 3 < 4,  3 < 5,  所以 4 比列表中其他数大 的次数,  是   0 注意到了吗? 比 其他数大的次数,…
计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个桶时,假设每一个桶的数据接近N/M个且桶内使用基于比較的排序,则桶排序的时间复杂度为O(N+M*N/M*log(N/M)).假设N=M时,每一个桶仅仅有一个数据,时间复杂度减少为O(N). 桶排序的时间复杂度为O(N+M),桶排序是稳定的排序 1.计数排序 计数排序介绍及C语言实如今:计数排序(链接…
计数排序 计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置,也就是说元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置,计数排序算法是一个稳定的排序算法. 算法过程 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间: 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内: 对额外空间内数据进行计算,得出每一个元素的正确位…
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了…
最简单的排序有三种:插入排序,选择排序和冒泡排序.它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了. 贴出源代码: 插入排序: def insertion_sort(sort_list): iter_len = len(sort_list) if iter_len < 2: return sort_list for i in range(1, iter_len): key = sort_list[i] j = i - 1 while j>=0 and sort_list[j]&g…
1.计数排序 # -*- coding: utf-8 -*- # @Time : 2018/07/31 0031 11:32 # @Author : Venicid def count_sort(li, max_num): count = [0 for i in range(max_num + 1)] for num in li: count[num] += 1 i = 0 for num, m in enumerate(count): for j in range(m): li[i] = nu…
作者:waterxi 原文链接 背景 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都…
问题提出: 将以下数据: 6, 8, 2, 3, 4, 0, 9, 1, 5,1 按从小到达排列. 桶排序原理: 桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现的次数.最后按顺序输出数据集里面的元素. 排序过程如下: 一.初始化桶的大小 把数据集里面每一个元素当作一个桶,由上面问题看出,原始数据范围在0--9之间,因此我就需要有10个桶,如下图 第一行为初始化计数为0,第二行为各个元素. 二.计数 接下来读入第一原始数据为6,则在下标为6的桶中增加1,如下…
数据的排序是在解决实际问题时经常用到的步骤,也是数据结构的考点之一,下面介绍10种经典的排序方法. 首先,排序方法可以大体分为插入排序.选择排序.交换排序.归并排序和桶排序四大类,其中,插入排序又分为直接插入排序.二分插入排序和希尔排序,选择排序分为直接选择排序和堆排序,交换排序分为冒泡排序和快速排序,桶排序以基数排序和计数排序为代表.这些排序方法的时间复杂度和空间复杂度分别如下表所示. 排序方法的稳定性是这样定义的:在待排序序列中如果存在a[i]和a[j],a[i]=a[j]&&i<…
1. 比较排序算法的下界 (1) 比较排序     到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.     如果仔细观察,我们会发现:在排序的最终结果中,各元素之间的次序依赖于它们之间的比较.我们把这类排序算法统称为比较排序.到目前为止我们介绍的排序算法都是比较排序.下面我们来论证一个事实:任何比较排序算法在最坏情况下都要经过Ω(n lgn)次比较. (2) 决策树模型     在证明之前,我们先介…
目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置. 在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²).在归并排序.快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(n…
B. Maximum Submatrix 2 time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output You are given a matrix consisting of digits zero and one, its size is n × m. You are allowed to rearrange its rows. W…
今天看了一本书,书里有道题,题目很常见,排序,明了点说: 需求:输入:最多有n个正整数,每个数都小于n, n为107 ,没有重复的整数 输出:按升序排列 思路:假设有一组集合 {1,3,5,6,11,12},我们可以用字符串来表示这组集合,0 1 0 1 0 1 1 0 0 0 0 1 1 代表集合中的数值的位为1,其他的都为0. 伪代码: // 将一个字符数组全部置为0,大小为给的数据中的最大值 for i = (0,n) ch[i] = 0; for each i in the int[]…
E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作,每次操作将(l,r)内的字符升序或降序排列,输出q次操作后的字符串. analyse: 基本思想是计数排序. 所谓计数排序,是对一个元素分布较集中的数字集群进行排序的算法,时间复杂度为O(n),但使用条件很苛刻.首先对n个数扫一遍,映射出每个数字出现的次数,然后再O(n)扫一遍处理出:对于数字ai,…
计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法. 算法思想 计数排序对输入的数据有附加的限制条件: 1.输入的线性表的元素属于有限偏序集S: 2.设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n). 在这两个条件下,计数排序的复杂性为O(n). 计数排序的基本思想是对于给定的输入序列中的每一个元…
算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定性而做的数据累加,大家听我说说就知道了: 1.首先,先取出要排序数组的最大值,假如我们的数组是int[] arrayData = { 2, 4, 1, 5, 6, 7, 4, 65, 42 };,那么最大值就是65.(代码17-21行就是在查找最大值) 2.然后创建一个计数数组,计数数组的长度就是我…
前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10633    Accepted Submission(s): 3707 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希…
B Age Sort Input: Standard Input Output: Standard Output   You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 100 or more years. Now, you are given a very si…
计数排序法:计数数组适用于当前数组密集的情况.例如(2,3,5,4,2,3,3,2,5,4) 方法:先找出最大值最小值,之后统计每个数出现的次数,根据次数从小到大往数组里添加 计数排序法是一种不需要比较的排序方法 void count(int top,int length,int arr[]) { ],max=arr[],i=,j=; )); )return; while(i<length)//先找出最大和最小值 { if(min>arr[i]) { min=arr[i]; } if(max&…
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const void* key1, const void* key2)); 返回值:成功 0:失败 -1. int merge_sort(void* data, int size, int esize, int lpos, int rpos, int (*compare)(const void* key1, co…
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵线段树,类似计数排序思想. #include <bits/stdc++.h> using namespace std; ; struct SegTree { ], sum[], l, r; }T[N << ]; ][N]; void pushup(int p, int c) { T[p…
前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序最坏情况肯定是Θ(nlgn).那有没有哪种排序算法的时间复杂度是线性的(Θ(n))呢?(因为我们如果要对一个数组排序,肯定至少要考察每个元素,因此可以推断Θ(n)是所有排序算法的下界).答案是:在一定条件下,是有的. 思考过程 为了更好的理解计数排序,我们先来想象一下如果一个数组里所有元素都是整数,…
//counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorithm> #include<cassert> using namespace std; ; ; , , , , , , }; int b[n]; ]; int main() { ; memset(c, , sizeof c); ;i<n;i++) { c[a[i]]++; maxn=ma…
题目给出一系列数字,然后问哪个数字是从小到大排在第几的,重复出现算第一个. 数据范围为10000,不大,完全可以暴力,sort不会超时. 但是由于以前做比赛时也遇到这种题目,没注意看数据范围,然后暴力被hack了.之后就学会了计数排序了. 这题也用计数排序做,挺快的,代码也不长. 代码: #include <cstdio> #include <cstring> const int maxn = 10001; int num[maxn], s[maxn]; int main() {…