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

posted @ 2018-10-14 21:20  skillking2  阅读(146)  评论(0编辑  收藏  举报