3、桶排序
1、思路:
①、首先找到数组中的最大值,然后新建一个初始值为 0 的数组 bucket, 此数组的长度是数组最大值+1,新建的这个数组中的下标值存放的元素就是原数组的数据值。
②、找到最大值后,开始遍历原数组,把原数组的数据加入bucket的下表中,bucket[i],每当有1个i bucket[i]的值就加一, 然后已经装入桶后,
③、遍历桶,如果bucket[j]位置不是 0 就说明此下标有数据,也就是说,此下标在原数组里有这个值, 然后排序 就是从大到小了 arr[i++]=j;
2、优化
创建 bucket 数组的大小为 (max - min) 即可。
3、 时间复杂度:O(N)
额外空间复杂度:O(N)
是否可实现稳定性:否
4、运用实例:
Leetcode 164. Maximum Gap
假设数组 nums 有N个元素min到max。
那么每个桶的最大差值不会小于ceiling[(max - min) / (N - 1)]
令最大差值就是 ceiling[(B - A) / (N - 1)]
去除 nums 的 max、val 值后 nums 剩下 N - 2 个元素
将他们放在 N - 1个桶中,且第 k 个桶存放的数值大小为 [min+ (k-1)gap, min+ k*gap).
5、基数排序:
动画演示:https://www.cs.usfca.edu/~galles/visualization/RadixSort.html
运用: https://www.cnblogs.com/skillking/p/9789980.html