基数排序

八大排序代码及时间测试

落花浮王杯 提交于 2019-11-29 22:36:26
大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列表的时间也不尽相同。今天,我就准备了八种排序的python代码,并且准备测试一下他们计算的时间 1基数排序 基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类 # 统计这个列表中数字最大的数字有几位 def radix_sort_nums(nums): max = nums[0] for i in nums: if max < i: max = i times = 0 while max > 0: max = int(max/10) times += 1 return times # 每个数字各个位置的数字大小,比如(123,1)则是3,(123,2)则是2 def get_num(num,n): return (int(num/(10**(n-1)))) % 10 # 主程序 def radix_sort(nums): count = 10*[None] # 定义的数组,用于存放当前位数的元素个数 bucket = len(nums)*[None] # 用于暂时存放排序结果 # 分别从个位/十位/百位开始循环 for pos in range(1, radix_sort_nums(nums)+1): #

Java实现八大排序算法

巧了我就是萌 提交于 2019-11-29 15:20:30
本文对常见的排序算法进行了总结。 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: \[ \begin{cases}内部排序 \begin{cases}插入排序\begin{cases}直接插入排序\\希尔排序\end{cases}\\选择排序\begin{cases}简单选择排序\\堆排序\end{cases}\\交换排序\begin{cases}冒泡排序\\快速排序 \end{cases}\\归并排序\\ 基数排序\end{cases}\\外部排序 \end{cases} \] \[ \left\{\begin{matrix} 内部排序\\ 外部排序 \end{matrix}\right. \] 稳定与非稳定 : 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的。反之,则是 非稳定 的。 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序

js十大排序算法:冒泡排序

柔情痞子 提交于 2019-11-29 15:16:58
排序算法说明: (1)对于评述算法优劣术语的说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度 : 一个算法执行所耗费的时间。 空间复杂度 : 运行完一个程序所需内存的大小。 (2)排序算法图片总结:    1.冒泡排序: 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。    2.第一轮的时候最后一个元素应该是最大的一个。    3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。 2.快速排序: 解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。 3.插入排序: 解析: (1) 从第一个元素开始,该元素可以认为已经被排序 (2) 取出下一个元素,在已经排序的元素序列中从后向前扫描 (3) 如果该元素(已排序)大于新元素,将该元素移到下一位置 (4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 (5)将新元素插入到下一位置中 (6) 重复步骤2    2.二分查找: 解析

js十大排序算法:冒泡排序

核能气质少年 提交于 2019-11-29 15:16:25
排序算法说明: (1)对于评述算法优劣术语的说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度 : 一个算法执行所耗费的时间。 空间复杂度 : 运行完一个程序所需内存的大小。 (2)排序算法图片总结:    1.冒泡排序: 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。    2.第一轮的时候最后一个元素应该是最大的一个。    3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。 2.快速排序: 解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。 3.插入排序: 解析: (1) 从第一个元素开始,该元素可以认为已经被排序 (2) 取出下一个元素,在已经排序的元素序列中从后向前扫描 (3) 如果该元素(已排序)大于新元素,将该元素移到下一位置 (4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 (5)将新元素插入到下一位置中 (6) 重复步骤2    2.二分查找: 解析

算法-java代码实现基数排序

て烟熏妆下的殇ゞ 提交于 2019-11-29 15:12:14
基数排序 第11节 基数排序练习题 对于一个int数组,请编写一个基数排序算法,对数组元素排序。 给定一个int数组 A 及数组的大小 n ,请返回排序后的数组。保证元素均小于等于2000。 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class RadixSort { 4 // 各位装通法 5 public int[] radixSort(int[] A, int n) { 6 int length = n; 7 int divisor = 1;// 定义每一轮的除数,1,10,100... 8 9 int[][] bucket = new int[10][length];// 定义了10个桶,以防每一位都一样全部放入一个桶中 10 int[] count = new int[10];// 统计每个桶中实际存放的元素个数 11 int digit;// 获取元素中对应位上的数字,即装入那个桶 12 13 for (int i = 1; i <= 3; i++) {// 经过4次装通操作,排序完成 14 for (int temp : A) {// 计算入桶 15 digit = (temp / divisor) % 10; 16

JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

£可爱£侵袭症+ 提交于 2019-11-29 05:59:46
1. 前言 算法为王。 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远 。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 之所以把 计数排序、桶排序、基数排序 放在一起比较,是因为它们的平均时间复杂度都为 O(n) 。 因为这三个排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作 线性排序 (Linear sort)。 之所以能做到线性的时间复杂度,主要原因是,这三个算法不是基于比较的排序算法,都不涉及元素之间的比较操作。 另外,请大家带着问题来阅读下文,问题:如何根据年龄给 100 万用户排序 ? 2. 桶排序(Bucket Sort) 桶排序是计数排序的升级版,也采用了 分治思想 。 思想 将要排序的数据分到有限数量的几个有序的桶里。 每个桶里的数据再单独进行排序(一般用插入排序或者快速排序)。 桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 比如: 桶排序利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量。 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。 桶排序的核心:就在于怎么把元素平均分配到每个桶里

python排序 基数排序

拜拜、爱过 提交于 2019-11-28 08:29:58
算法思想 基数排序通过按位比较(一般从最低位开始)将元素按照最低位的数放到10个桶中,当所有的元素都这样被处理一次后,在按从0到9的顺序将每个桶的元素再取出来(不关注其他位的,只关注当前位的)这样就完成了所有元素最低位的有序性,然后不断的重复上面的步骤,知道所有元素的最高位都经过处理了。 算法步骤 初始化桶,共有10个,分别存放当前位位0-9的元素 从元素的最后一位开始,按照最后一位的数字将其放到相应的同元素中。对列表中的每个元素都进行上面的操作后,从0号桶开始,将元素从桶中取出来,这样就完成了一个位数的排序 重复上一过程,如果发现元素最高位已经被处理过,就把他添加到最终的结果中 算法实现 算法的主要问题在于对当前位的获取中 对于正数 (element//divisor)%10#结果是当前位上的数#divisor代表当前位,个位是1,十位是10,百位是100#//是向下取整的意思   如过element//divisor结果为0 就代表实际结果小于1了,即当前位已经是0了 对于负数 collection[j]//i==-1#代表是负数   取得当前位 (10-math.ceil(element/divisor)%10)%10#math.ceil()是向上取整 #最后一个%10是防止前面结果=10的情况出现 算法实现 def radix_sort3(collection): ''

排序算法之基数排序

回眸只為那壹抹淺笑 提交于 2019-11-28 07:36:13
基本思想: BinSort想法非常简单,首先创建数组A[MaxValue];然后将每个数放到相应的位置上(例如17放在下标17的数组位置);最后遍历数组,即为排序后的结果。 过程: 问题: 当序列中存在较大值时,BinSort 的排序方法会浪费大量的空间开销。 基本思想: 基数排序是在BinSort的基础上,通过基数的限制来减少空间的开销。 (1)首先确定基数为10,数组的长度也就是10.每个数都会在这10个数中寻找自己的位置。 (2)不同于BinSort会直接将数21放在数组的下标21处,基数排序是将21分开为2和1,第一轮排序根据最末位放在数组的下标1处,第二轮排序根据倒数第二位放在数组的下标2处,然后遍历数组即可。 代码: public static void RadixSort(int A[],int temp[],int n,int k,int r,int cnt[]){ //A:原数组 //temp:临时数组 //n:序列的数字个数 //k:最大的位数2 //r:基数10 //cnt:存储bin[i]的个数 for(int i=0 , rtok=1; i<k ; i++ ,rtok = rtok*r){ //初始化 for(int j=0;j<r;j++){ cnt[j] = 0; } //计算每个箱子的数字个数 for(int j=0;j<n;j++){ cnt[(A

十大排序

点点圈 提交于 2019-11-28 00:09:35
比较排序: 冒泡:两两交换 选择:选择末序列最大(最小)值,同对应位置交换 插入:从后往前扫描有序序列 希尔排序:又叫做缩小增量排序,希尔增量:n/2 n/4 ... 1,O(n^2),Hibbard增量:1,3,7,2hk-1,O(n^1.5);下界为O(nlog(2n)) 非比较排序: 桶排序:N个待排数据,M个桶,平均每个桶[N/M]个数据的桶排序平均时间复杂度为:O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)     即:平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好时间复杂度达到O(N)。当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。 基数排序:n个待排数据,d个关键码,关键码取值范围radix,则时间复杂度:O(d*(n+radix)) 总结 冒泡排序是基础,每轮遍历将“最大元素”移至正确位置(“最右边”),不稳定的O(n^2); 选择排序要了解,选择排序每轮遍历将“最小(大)元素”移至正确位置(“最左(右)边”),稳定的O(n^2); 插入排序最简单,适合数据量较小的排序,依然是O(n^2); 希尔排序是插入排序升级版,不好用,为O

Java八大排序之基数排序

此生再无相见时 提交于 2019-11-27 15:15:38
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。 步骤:   一,求出一个数组中最大的数的位数,表示要排序多少次;   二,先根据个位数排序,个位数相同的放入相同的桶子中,分别对应着0-9的桶子;   三,然后将桶子中的数据重新串连起来,按照0-9的桶子顺序和先进先出的规则;   四,重复第二步和第三步,只是之后的个位数分别设为十位数,百位数,千位数......,直到排序次数完结。 执行过程图: 代码: 1 public class RadixSort { 2 //最大数的位数 3 public static int maxLength(int[] arrays){ 4 int maxArr = arrays[0]; 5 for (int i = 0; i < arrays.length-1; i++){ 6 if (arrays[i] < arrays[i+1]){ 7 maxArr = arrays[i+1]; 8 } 9 } 10