排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完成时间复杂度同样为O(n)的求Top N热词的小功能应用. 算法思想 01 n个数据需要排序,就把数据映射到 [0, n-1] ,然后用 int 数组 id2num [n] 完成 "编号 to 出现次数的映射 ": 简单来说,对于正整数数据,先找到最大值maxData,那么可以直接创建 i…
js中要实现数据排序,其实只需要用sort函数就能很好的满足了,但是我今天想知道他和其他排序算法的区别,比如耗时呀等.测了一组数据如下: // ---------- 一些排序算法 Sort = {} Sort.prototype = { // 利用sort进行排序 systemSort:function(array){ return array.sort(function(a, b){ return a - b; }); }, // 冒泡排序 bubbleSort:function(array)…
啥?你以为排序算法的时间复杂度最快也只能O(N*log(N))了? O(N)时间复杂度的排序算法听说过没有?计数排序!!它是世界上最快最简单的算法!!! 计数排序算法操作起来只有三步,看完秒懂! 根据待排序集合中最大元素和最小元素的差值范围确定申请的桶个数: 遍历待排序集合,将每一个元素统计到对应的桶中:(此步完成后每个桶里面的数字代表了此桶对应元素出现的次数.) 从小到大遍历一遍所有桶,如果桶中有元素,那么就往排序结果里添加上对应个数的该桶对应的元素. 举个例子就明白了,假设已知所有待排序数字…
计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法. 算法思想 计数排序对输入的数据有附加的限制条件: 1.输入的线性表的元素属于有限偏序集S: 2.设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n). 在这两个条件下,计数排序的复杂性为O(n). 计数排序的基本思想是对于给定的输入序列中的每一个元…
目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置. 在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²).在归并排序.快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(n…
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,…
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…
前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序最坏情况肯定是Θ(nlgn).那有没有哪种排序算法的时间复杂度是线性的(Θ(n))呢?(因为我们如果要对一个数组排序,肯定至少要考察每个元素,因此可以推断Θ(n)是所有排序算法的下界).答案是:在一定条件下,是有的. 思考过程 为了更好的理解计数排序,我们先来想象一下如果一个数组里所有元素都是整数,…
让我们来谈谈数的排序思维: 计数排序假定待排序的全部元素都是介于0到K之间的整数.计数排序使用一个额外的数组countArray.当中第i个元素是待排序数组array中值等于i的元素的个数.然后依据数组countArray来将array中的元素排到正确的位置. 算法的步骤例如以下: 找出待排序的数组中最大和最小的元素 统计数组中每一个值为i的元素出现的次数,存入数组countArray的第i项 对全部的计数累加(从countArray中的第一个元素開始,每一项和前一项相加) 反向填充目标数组:将…
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为O(nlgn)的比较排序高. 计数排序有一定的局限性,其中最大的局限就是它只能用于整型或那么可以用整型来表示的数据集合.原因是计数排序利用一个数据的索引来记录元素出现的次数,而这个数组的索引就是元素的数值.例如,如果整数3出现过4次,那么4将存储到数组索引为3的位置上.同时,我们还需要知道集合中最大…