基数排序

基数排序算法

青春壹個敷衍的年華 提交于 2020-02-07 15:50:52
基数排序 ( Radix sort)是一种 非比较型整数排序算法 ,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。 它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。 本文地址: http://www.cnblogs.com/archimedes/p/radix-sort-algorithm.html

基数排序

烂漫一生 提交于 2020-02-07 15:49:00
基数排序 ( 英语 : Radix sort )是一种非比较型 整数 排序算法 ,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年 赫尔曼·何乐礼 在 打孔卡片制表机 (Tabulation Machine)上的贡献 [1] 。 它是这样实现的: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这 样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。 wikipedia百科定义: Each key is first figuratively dropped into one level of buckets corresponding to the value of the rightmost digit. Each bucket preserves the original order of the keys as the keys are

java排序之基数排序

…衆ロ難τιáo~ 提交于 2020-02-06 18:16:59
基数排序 package q; import java.util.Arrays; public class c { private static void radixSort(int[] array,int d) { int n=1;//代表位数对应的数:1,10,100... int k=0;//保存每一位排序后的结果用于下一位的排序输入 int length=array.length; int[][] bucket=new int[10][length];//排序桶用于保存每次排序后的结果,这一位上排序结果相同的数字放在同一个桶里 int[] order=new int[10];//用于保存每个桶里有多少个数字 while(n<d) { for(int i=0;i<array.length;i++)//将数组array里的每个数字放在相应的桶里 { int digit=(array[i]/n)%10; bucket[digit][order[digit]]=array[i]; order[digit]++; } for(int i=0;i<10;i++)//将前一个循环生成的桶里的数据覆盖到原数组中用于保存这一位的排序结果 { if(order[i]!=0)//这个桶里有数据,从上到下遍历这个桶并将数据保存到原数组中 { for(int j=0;j<order[i];j++)

Java排序算法

拟墨画扇 提交于 2020-02-04 00:53:35
排序算法 一、概述 排序算法(Sort Algorithm),排序是将一组数据依指定的顺序进行排列的过程 1. 分类 1.1 内部排序 将需要处理的所有数据都加载到**内部存储器(内存)**中进行排序 1.2 外部排序 数据量过大时,无法全部加载到内存中,需要借助外部存储器进行排序 2. 常见排序算法 二、算法的时间复杂度 1. 时间频度 一个算法花费的时间与算法中语句的执行次数成正比例,算法中语句的执行次数越多,则它花费的时间就越多。 一个算法中的语句执行次数称为语句频度或时间频度 ,记为: T(n) 2. 举例说明 2*n+20和2n随着n的增大,两个表达式的结果会逐渐接近 2n 2+3n+10和2n 2随着n增大,两个表达式的值会逐渐接近 随着n的增大,5n 2+7n和3n 2+2n结果逐渐接近 结论 : 常数项可以忽略 低次项可以忽略 高次项系数可以忽略 3. 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n)的极限值为不等于零的常数,则称f(n)为T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度 T(n)不同,当时间复杂度可能相同。如:T(n)=n 2+7n+6与T(n)=3n 2+2n

桶排序之计数排序与基数排序

大憨熊 提交于 2020-01-29 09:28:55
桶排序之计数排序和基数排序 桶排序 一种常见的排序算法,工作原理是将数组分到有限数量的桶子里,每个桶子再个别进行排序(会使用递归的方式继续使用桶排序进行排序或者使用其他的排序算法). 计数排序 计数排序是桶排序的一种特殊情况 从图中可以看出,待排序数字在[1,9]范围内; 创建9个空桶,将待排序数字分别放在对应的桶中; 再依次将桶中的元素按照桶的顺序拿出; 代码实现: public class CountSort { public static void main ( String [ ] args ) { int [ ] arr = { 2 , 4 , 2 , 3 , 7 , 1 , 1 , 1 , 0 , 5 , 6 , 9 , 8 , 7 , 4 , 0 , 9 } ; int [ ] result = sort ( arr ) ; System . out . println ( Arrays . toString ( result ) ) ; } static int [ ] sort ( int [ ] arr ) { //新建一个数组用来存放最终的结果 int [ ] result = new int [ arr . length ] ; //10个桶 int [ ] count = new int [ 10 ] ; //计数,计算每个桶中有多少个数字 for (

动画 | 什么是基数排序?

大憨熊 提交于 2020-01-27 14:12:16
基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。 基数排序可以看成多(单)关键字的排序,可以想象成桶排序那样分桶排序,也可以像计数排序那样归约化分治。 基数排序的思想是将待排序序列中的每组关键字进行桶排序。例如整数序列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]上每个位、十位和百位上的数字看成是一个关键字。 基数排序有两种方式进行,一种是LSD,从右边关键字开始排序,另一种是MSD,从左边关键字开始排序。 基数排序LSD 我们将输入数组[103, 9, 1,7,11,15, 25, 201, 209, 107, 5],从右边关键字开始,以个位数上开始分桶,对于数字,每一个关键字取值范围是0~9,最多需要10个桶。如果是字符,按ASCII码最多需要128个桶,看情况而定。 为了保证元素之间的稳定性,就按计数排序一样,将给出一个统计数组c,长度为10,统计输入数组每一个元素对应的关键字。然后从统计数组c第2个位置开始,进行当前一项和前一项的累加。累加完之后反向填充数组b,也将数组b直接复制到数组array。 再进行循环操作exp *= 10

基数排序

元气小坏坏 提交于 2020-01-19 03:39:59
基数排序 基数排序的本质实则是桶排序,对每一位基位数进行一次排序 例如: 基数排序中,我们将借助链表来当作桶 其中需要说明的内容,在代码中写好注释: # include <iostream> # include <list> // 使用C++ 封装好的模板类 # include <algorithm> // 算法库 using namespace std ; int MaxNum ( int * arr , int n ) { initializer_list < int > i_list ( arr , arr + n - 1 ) ; // 将数组元素放入到一个列表中 int Max = max ( i_list ) ; // 调用 算法库中的 max 求出最大值 int count = 0 ; while ( Max > 0 ) // 求出最大值是几位数 用于对数进行几次桶排序 { count ++ ; Max / = 10 ; } return count ; } void RadixSort ( int * arr , int n ) // 基数排序 { int idigit = MaxNum ( arr , n ) ; list < int > myList [ 10 ] ; // 10 个链表 10个桶 for ( int i = 0 , k = 1 ; i <

后缀数组

。_饼干妹妹 提交于 2020-01-19 02:50:17
后缀数组个人感觉的确有点复杂,看了挺久的,听说后缀数组是一种神仙操作,忘记在哪听到这个就学了一下 学习博客:https://www.cnblogs.com/victorique/p/8480093.html 什么是后缀数组 我们先看几条定义: 子串 在字符串s中,取任意i<=j,那么在s中截取从i到j的这一段就叫做s的一个子串 后缀 后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义 以s的第i个字符为第一个元素的后缀为suff(i) 后缀数组 把s的每个后缀按照字典序排序, 后缀数组sa[i]就表示 排名为i的后缀 的起始位置的下标 而它的映射数组rk[i]就表示 起始位置的下标为i的后缀 的排名 简单来说,sa表示排名为i的是啥,rk表示第i个的排名是啥 一定要记牢这些数组的意思,后面看代码的时候如果记不牢的话就绝对看不懂 后缀数组的思想 先说最暴力的情况,快排(n log n)每个后缀,但是这是字符串,所以比较任意两个后缀的复杂度其实是O(n),这样一来就是接近O(n^2 log n)的复杂度,数据大了肯定是不行的,所以我们这里有两个优化。 ps:本文中的^表示平方而不是异或 倍增 首先读入字符串之后我们现根据单个字符排序,当然也可以理解为先按照每个后缀的第一个字符排序。对于每个字符,我们按照字典序给一个排名(当然可以并列),这里称作关键字。

数据结构——基数排序(算法)

末鹿安然 提交于 2020-01-16 01:53:59
基数排序(桶排序)介绍: 基数排序(radix sort)属于“分配式排序”,又称桶子法,它是通过键值的各个位的值,将要排序的元素分配到某些“桶”中,达到排序的作用 基数排序法是属于稳定性排序,基数排序法是效率高的稳定性排序法。 基数排序是桶排序的扩展。 基数排序是1887年赫尔曼·何乐礼发明的,它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。 基本思想: 将所有待比较数值统一为同样数位长度,数位较短的数前面补0,然后从最低位开始,依次进行依次排序,这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。 原理图 原理代码示例 private static void radixSort ( int [ ] array ) { /*定义一个二维数组,表示10个桶,每个桶是一位数组*/ /*说明: * 1、二维数组包含10个以为数组 * 2、为了防止在放入数据的时候,数据溢出,则每个一位数组(桶),大小定义为array.length * 3、基数排序是使用空间换时间的经典算法*/ int [ ] [ ] bucket = new int [ 10 ] [ array . length ] ; /*为了记录每个桶中,实际存放了多少个数据,定义一个一维数组记录每个桶中的数组个数 * eg:bucketElementsCount[0]

05排序之基数排序

谁说我不能喝 提交于 2020-01-07 02:04:57
基数排序 数据结构整理目录 基本介绍 1)基数排序属于 “分配式排序,又称桶子法,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些”桶“中,达到排序的作用 2)基数排序是属于稳定性的排序,基数排序法是效率高的稳定性排序法;基数排序是经典的空间换时间的方式,占用内存很大,当对海量数据排序时,容易造成OutOfMemoryError 3)基数排序是 桶排序 的扩展 4)基数排序是这样实现的: 将整数按位数切割成不同的数字,然后按每个位数分别比较。 ;对于负数的情况,需要区别对待、 分析 基本思想 将所有待比叫数值统一为同样的数位长度,数位较短的数前面补0。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列 图文解释如下 第一轮排序: (1)将每个元素的个位数取出,然后看这个数应该放在哪个对应的桶(一个于维数组) (2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组) 第二轮排序 (1)将每个元素的 十位数 取出,然后看这个数应该放在哪个对应的桶(一个于维数组) (2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组) 第三轮排序 (1)将每个元素的百位数==取出,然后看这个数应该放在哪个对应的桶(一个于维数组) (2)按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组) 小结: