桶排序

非比较排序——桶排序

这一生的挚爱 提交于 2020-01-07 14:27:54
1、基本思想 划分多个范围相同的区间,每个自区间自排序,最后合并。 桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。 桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。 不同的桶排序原理一样,主要区别于桶里面的排序类型 2、动画演示 3、代码演示 package sort ; import java . util . ArrayList ; import java . util . Arrays ; import java . util . Collections ; public class BucketSort { public static void main ( String [ ] args ) { int [ ] arr = { 2 , 4 , 3 , 1 , 6 , 7 , 5 , 9 , 8 } ; bucketSort ( arr ) ; System . out . println ( Arrays . toString ( arr ) ) ; } private static void bucketSort ( int [ ] arr ) { /

【每日算法】排序算法总结(复杂度&稳定性)

做~自己de王妃 提交于 2020-01-03 05:15:03
一、插入排序:稳定,时间复杂度O(n^2) 想象你在打扑克牌,一開始左手是空的,接着右手開始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们须要从右到左将它与手中的牌比較,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。 详见: 插入排序 二、选择排序:不稳定,时间复杂度O(n^2) 每趟从未排序部分选出最小的元素。然后通过交换将其加入到已排序部分中。 详见: 选择排序 三、冒泡排序:稳定,时间复杂度O(n^2) 将待排序的元素看作是竖着排列的“气泡”。较小的元素比較轻。从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。 假设发现两个相邻元素的顺序不正确。即“轻”的元素在以下,就交换它们的位置。显然。处理一遍之后,“最轻”的元素就浮到了最高位置;处理两遍之后。“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。 一般地。第i遍处理时,不必检查第i高位置以上的元素。由于经过前面i-1遍的处理,它们已正确地排好序。 详见: 冒泡排序 四、归并排序:稳定。时间复杂度 O(nlog n),空间O(n) 分解:将n个元素分成各含n/2个元素的子序列。 解决:用归并排序法对两个子序列递归地排序。 合并

JavaScript实现10大算法可视化

别来无恙 提交于 2020-01-03 05:13:17
本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途。 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript),如今早已光芒万丈。node JS的出现更是让JavaScript可以前后端通吃。虽然Java依然制霸企业级软件开发领域(C/C + +的大神们不要打我。。。),但在Web的江湖,JavaScript可谓风头无两,坐上了头把交椅。 然而,在传统的计算机算法和数据结构领域,大多数专业教材和书籍的默认语言都是Java或者C/C+ +。这给最近想恶补算法和数据结构知识的我造成了一定困扰,因为我想寻找一本以JavaScript为默认语言的算法书籍。当我了解到O’REILLY家的动物丛书系列里有一本叫做《数据结构与算法JavaScript描述》时,便兴奋的花了两天时间把这本书从头到尾读了一遍。它是一本很好的针对前端开发者们的入门算法书籍,可是,它有一个很大的缺陷,就是里面有很多明显的小错误,明显到就连我这种半路出家的程序猿都能一眼看出来。还有一个问题是,很多重要的算法和数据结构知识并没有在这本书里被提到。这些问题对于作为一个晚期强迫症患者的我来说简直不能忍。于是乎

LeetCode.No6——Z字形变换

吃可爱长大的小学妹 提交于 2020-01-03 04:07:28
题目 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下: 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。 思路 虽然题目说是Z字形,但我理解为N字形。看到题目时,第一时间想到的是递归,经过计算可发现规律,即每次递归时,第一个字符和第二个字符之间的相隔 2n - 3 个字符(n >=2),后来发现提取数组比较麻烦,作罢。 之后很快地想到了桶排序,故用了桶排序。 解法:桶排序解题 算法较为简单易懂,代码有注释。 public class Main { public static void main ( String [ ] args ) { // write your code here String s = "Apalindromeisaword,phrase,number,orothersequenceofunitsthatcanbereadthesamewayineitherdirection,withgeneralallowancesforadjustmentstopunctuationandworddividers." ; int numRows = 3 ; s = convert ( s , numRows ) ;

基数排序(桶排序)整理

好久不见. 提交于 2019-12-31 02:26:33
基数排序介绍 1.基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 2.基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 3.基数排序(Radix Sort)是桶排序的扩展 4.基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。 基数排序的基本思想 1.将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 2.这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤 图解 说明 1.基数排序是对传统桶排序的扩展,速度很快。 2.基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError 。 3.基数排序时稳定的。[注:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的

排序算法以及其java实现

╄→尐↘猪︶ㄣ 提交于 2019-12-21 20:09:17
一、术语了解 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度 :运行完一个程序所需内存的大小。 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 二、基础算法 1、冒泡算法 (1)思想:两两比较,每一趟都把最大或最小的数浮出 (2)优化:设置一个boolean isOrdered ;       在第一轮排序中一旦a[j] > a[j+1],就把isOrdered设为false,否则isOrdered设为true,然后我们在每趟排序前检查isOrdered,一旦发现它为false,即认为排序已完成。 (3)时间复杂度:要进行的比较次数为: (n-1) + (n-2) + ... + 1 = n*(n-1) / 2,因此冒泡排序的时间复杂度为O(n^2)。          最好的为O(n):数组已经有序,比较次数为n-1        public static void bubbleSort(int[] arr) {

十大经典排序算法

青春壹個敷衍的年華 提交于 2019-12-21 02:53:29
转自https://blog.csdn.net/hellozhxy/article/details/79911867 0、排序算法说明0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度:运行完一个程序所需内存的大小。 例子 数据量低时,O(1) 和 O(n^2)的区别可以忽略不计。比如,你有个算法要处理2000条元素。 O(1) 算法会消耗 1 次运算 O(log(n)) 算法会消耗 7 次运算 O(n) 算法会消耗 2000 次运算 O(n*log(n)) 算法会消耗 14,000 次运算 O(n^2) 算法会消耗 4,000,000 次运算 O(1) 和 O(n^2) 的区别似乎很大(4百万),但你最多损失 2 毫秒,只是一眨眼的功夫。确实,当今处理器每秒可处理上亿次的运算。这就是为什么性能和优化在很多IT项目中不是问题。 我说过,面临海量数据的时候,了解这个概念依然很重要。如果这一次算法需要处理 1,000,000 条元素

线性排序:如何根据年龄给100W用户数据排序

三世轮回 提交于 2019-12-16 09:21:16
线性排序:如何根据年龄给100W用户数据排序 桶排序、计数排序、基数排序,因为这些算法的时间复杂度是线性的,所以叫做线性排序,之所以能做到线性的时间复杂度,是因为这三个算法是基于比较的排序算法,都不涉及元素之间的比较操作 重点是掌握这些排序算法的适用场景 桶排序(bucket sort) 核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序,桶内排完序之后,再把每个桶里面的数据按照顺序依次取出,组成的序列就是有序的 桶排序的时间复杂度是O(n):如果要排序的数据有n个,把它们均匀的划分到m个桶内,每个桶里就有k = n/m个元素,每个桶内部使用快排,时间复杂度为O( k ∗ l o g k k*logk k ∗ l o g k ),m个桶就是O( m ∗ k ∗ l o g k m*k*logk m ∗ k ∗ l o g k ),因为k=n/m,所以m个桶即整个桶的时间复杂度是O( n ∗ l o g ( n / m ) n*log(n/m) n ∗ l o g ( n / m ) ),当桶的个数m接近数据个数n时,log(n/m)就是一个非常小的常量,桶排序的时间复杂度接近O(n) 桶排序看起来很优秀,但是不能替代之前的排序算法,因为桶排序对排序数据的要求很苛刻,首先,要排序的数据需要很容易划分成m个桶,并且,桶与桶之间有天然的大小顺序

c/c++实现桶排序

自作多情 提交于 2019-12-11 06:59:24
桶排序 - 实现线性排序,但当元素间值得大小有较大差距时会带来内存空间的较大浪费。首先,找出待排序列中得最大元素max,申请内存大小为max + 1的桶(数组)并初始化为0;然后,遍历排序数列,并依次将每个元素作为下标的桶元素值自增1;最后,遍历桶元素,并依次将值非0的元素下标值载入排序数列(桶元素>1表明有值大小相等的元素,此时依次将他们载入排序数列),遍历完成,排序数列便为有序数列。 时间复杂度:O(x*N)   稳定性:稳定 /*桶排序*/ void bucketSort ( vector < int > & arr ) { int max = getMaxValue ( arr ) ; int * pBuf = new int [ max + 1 ] ; memset ( pBuf , 0 , ( max + 1 ) * sizeof ( int ) ) ; for ( auto const i : arr ) ++ pBuf [ i ] ; for ( int i = 0 , j = 0 ; i <= max ; ++ i ) { while ( pBuf [ i ] -- ) arr [ j ++ ] = i ; } delete [ ] pBuf ; } 来源: CSDN 作者: 卧_听风雨 链接: https://blog.csdn.net

海量数据处理学习笔记

南笙酒味 提交于 2019-12-08 18:03:54
一:数据处理常见方法:hash方法、bit-map法(位图)、bloom filter(布隆过滤器)、数据库优化法、倒排序索引法、外排序索引法、tire树、堆、双层桶排序、mapreduce。 二:hash法 hash一般称为散列,是一种映射关系。构建散列表需要设定一个散列函数,加油设定一个冲突处理方法。冲突处理主要有:开放地址法(当地址发生冲突时,按照固定函数在散列,知道找到空闲位置)链地址法(设置指针组ch【m】,所有散列地址为i的数据元素都插入到头指针为策划ch【i】的链表中)再散列法(在散列冲突使用第二个、第三个。。。直到无冲突)建立公共溢出区。 hash主要是用来进行“快速存取”,在o(1)的时间复杂里,可以查找到元素,或者判断元素是否存在。 三、bit-map法 例题:从八位号码中找出重复号码,或删除重复号码。8位数字最多可以表示99999999个号码,每存储一个号码占用一个bit位,则需要99mbit,12.75MB就可以存储。例如,00000123的号码,把第123位置为1,当位为1时输出改位当前下标,则得出改信息。 三:blooom filter法 bloom filter的基本思想是位数组和hash函数的联合使用。包涵一个m位的位数组,初始化为0,定义k个不同的hash函数,每个函数为映射到一位。置为1,查询某元素是否存在时,检测该k个位是否全部为1。特点