当前位置: 首页 > 后端技术 > Python

Python实现·桶排序

时间:2023-03-26 14:58:06 Python

桶排序< titlesplit >十大排序算法介绍在一个桶中,即根据元素值特征将集合拆分成多个区域,拆分后形成的多个桶在从取值范围来看是一种有序状态。对每个桶中的元素进行排序,则对所有桶中的元素集合进行排序。桶排序是计数排序的扩展版本。计数排序可以看做是每个桶中只存储相同的元素,而桶排序则在每个桶中存储一定范围内的元素。桶排序需要保证元素分布均匀,否则当所有数据都集中在同一个桶中时,桶排序就会失败。算法实现步骤根据待排序集合中最大元素与最小元素的差值范围和映射规则,确定申请的桶数;遍历排序序列,将每个元素放入对应的桶中;检查不为空的桶排序;按顺序访问桶,将桶中的元素放回原序列中对应的位置,完成排序。python代码实现)/len(arr)#bucketarraycount_list=[[]foriinrange(len(arr)+1)]#fillbucketarrayforiinarr:count_list[int((i-min_num)//bucket_range)].append(i)arr.clear()#回填,这里bucket内部排序直接调用sortedforiincount_list:forjinsorted(i):arr.append(j)#testdataif__name__=='__main__':importrandomrandom.seed(54)arr=[random.randint(0,100)for_inrange(10)]print("原始数据:",arr)bucket_sort(arr)print("桶排序结果:",arr)#输出原始数据:[17,56,71,38,61,62,48,28,57,42]桶排序结果:[17,28,38,42,48,56,57,61,62、71】动画演示算法分析时间复杂度bestcase:输入序列排序,插入排序的时间复杂度为$O(n)$,即最好情况下时间复杂度为$O(n)$。最坏情况:待排序序列的大小为$n$,分为$k$个桶,需要$n$个循环将每个元素加载到对应的桶中;$k$循环,对每个桶中的数据进行排序(平均每个桶中有$n/k$个元素)。如果使用快速排序算法进行排序,单次排序的平均时间复杂度为$O(nlog_2n)$,最差的时间复杂度为$O(n^2)$。桶排序过程是以链表的形式插入的,所以整个桶排序的时间复杂度为:$$平均时间复杂度:O\left(n\right)+O\left(k\times\left(\frac{n}{k}\log_2\left(\frac{n}{k}\right)\right)\right)=O\left(n\times\left(\log_2\left(\frac{n}{k}\right)+1\right)\right)\\最差时间复杂度:O\left(n\right)+O\left(k\times\left(\frac{n}{k}\right)^2\right)=O\left(n+\frac{n^2}{k}\right)$$当$n=k$时,时间复杂度最低为$O(n)$;当$k=1$时,时间复杂度最高为$O(n+n^2)$。所以最坏的时间复杂度是:$O(n^2)$。平均情况:平均时间复杂度为$O(n)$。空间复杂度桶排序需要为$k$个桶和$n$个元素创建额外的空间,所以桶排序的空间复杂度为$O(n+k)$。稳定性桶排序的稳定性取决于桶中排序所用的算法。如果是队列,可以保证同一元素取出和放回的相对位置不变,即排序是稳定的,而如果用栈实现,则排序一定是不稳定的。因为桶排序可以是稳定的,所以桶排序是一种稳定的排序算法。综合评价时间复杂度(平均)时间复杂度(最好)时间复杂度(最差)空间复杂度排序稳定性$O(n)$$O(n)$$O(n^2)$$O(n+k)$out-placeStable联系我们个人博客网址:http://www.bling2.cn/Github地址:https://github.com/lb971216008/Use-Python-to-Achieve知乎专栏:https://zhuanlan.zhihu。com/Use-Python-to-Achieve小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve博客园:https://www.cnblogs.com/Use-Python-to-Achieve