首页 > 编程知识 正文

快速选择排序图解,桶排序的思路

时间:2023-05-03 15:54:27 阅读:141715 作者:2487

一、思想用一句话概括:划分多个范围相同的区间,每个子区间自排序,最后合并

桶排序是计数排序的扩展版,计数排序可以认为每个桶只存储了相同的元素。 另一方面,桶排序在每个桶中存储一定范围的要素。 使用映射函数将要排序的数组的元素映射到相应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原始序列中。

桶排序必须使元素的方差尽可能均匀。 否则,当所有数据集中在同一个桶中时,桶排序就会失效。

二.图解过程

三、核心代码publicstaticvoidbucketsort (int [ ] arr ) ) /计算最大值和最小值int max=Integer.MIN_VALUE; int min=Integer.MAX_VALUE; for(intI=0; i arr.length; I ) ) max=math.max(max,arr[i]; min=math.min(min,arr[i] ); (//要计算桶数的intbucketnum=(max-min )/arr.length 1; arraylistarraylistintegerbucketarr=new ArrayList (bucket num ); for(intI=0; i bucketNum; I ) ) bucket arr.add (newarraylistinteger (); //将各元素放入桶for中(intI=0; i arr.length; I ) intnum=(arr[I]-min )/)/(arr.length ); bucketARR.get(num ).add ) ARR[I]; //按桶排序for(intI=0; i bucketArr.size (; I ) { collections.sort (bucket arr.get ) I ); //将桶元素代入原始数组int index=0; for(intI=0; i bucketArr.size (; I ) for(intj=0; jbucketARR.get(I ).size ); j(ARR[index]=bucketARR.get(I ).get ) j; ()四、复杂度分析1 .时间复杂度: o(NC )排序对象序列大小为n,共分为m个桶,主要步骤如下:

n次循环,将每个元素放入相应的桶中并对m次循环,每个桶的数据进行排序(平均每个桶有N/M个元素) )通常,时间复杂度为o ) nLOGN ) o ) nLOGN ) nLOGN ),实际上

整个桶排序的时间复杂度如下。

o(n ) o ) m ) n/mLOg(n/m ) ) ) n ) ) n ) o ) m * (n/m * log (n/m ) n/m ) ) ) o ) o ) o ) o ) n ) n ) l ) l65

在N=M的情况下,复杂度为o(n ) o ) n ) o ) n )

2 .额外空间复杂度: o(nm )五、稳定性分析桶排序的稳定性取决于桶内排序所用的算法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。