「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
基数排序
基数排序原理
今天的排序算法可能比之前的稍微难点。基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。属于“分配式排序”,又称“桶子法”或bin sort。最早用于解决卡片排序的问题。
基数排序是可以应对字符的,针对于字符串的基数排序就诞生了,它是在计数排序的基础上进行了改进,在某些时候,基数排序法的效率高于其它的稳定性排序法。基数排序从最低为开始来排序的,从低位到高位,按位排序,按位排序必须是稳定的。
基本思想:对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。
算法实现
1、算法描述
- 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
- 从最低位开始,依次进行一次排序。
- 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
2、图示
3、算法空间复杂度和时间复杂度
时间复杂度:
- 最坏:o(d(r+n)d(r+n)d(r+n))
- 最好:o(d(rd+n)d(rd+n)d(rd+n))
- 平均:o(d(r+n)d(r+n)d(r+n))
空间复杂度(辅助存储):o(rd+nrd+nrd+n)
稳定性:稳定
ps:r:关键字基数 d:长度 n:关键字个数
例题
用基数排序将以下数列按照从小到大的顺序输出:123,45,6,22,99,1,38,41,7,0
java代码:
1 | java复制代码import java.util.*; |
计数排序
计数排序原理
计数排序是一个非基于比较的排序算法,它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
简单来说,就是通过数组下标来确定正确的位置,并在数组中记录出现的次数,最后得到有序数据。
核心思想:统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引
算法实现
1、算法描述
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C 的第i项
- 对所有的计数累加 (从C 中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1
2、图示
3、算法空间复杂度和时间复杂度
时间复杂度:
- 最坏:o(n+kn+kn+k)
- 最好:o(n+kn+kn+k)
- 平均:o(n+kn+kn+k)
空间复杂度(辅助存储):o(n+kn+kn+k)
稳定性:稳定
例题
用计数排序将以下数列按照从小到大的顺序输出:
66,13,51,76,81,26,57,69,23
java代码:
1 | java复制代码import java.util.*; |
本文转载自: 掘金