基于python进行桶排序与基数排序的总结

作者:笛在月明 时间:2023-06-13 17:32:33 

本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。

一、桶排序:

排序一个数组[5,3,6,1,2,7,5,10]

值都在1-10之间,建立10个桶:

[0 0 0 0 0 0 0 0 0 0] 桶

[1 2 3 4 5 6 7 8 9 10] 桶代表的值

遍历数组,第一个数字5,第五个桶加1


[0 0 0 0 1 0 0 0 0 0]

第二个数字3,第三个桶加1


[0 0 1 0 1 0 0 0 0 0]

遍历后


[1 1 1 0 2 1 1 0 0 1]

输出


[1 2 3 5 5 6 7 10]

代码:


def bucket_sort(lst):
buckets = [0] * ((max(lst) - min(lst))+1)
for i in range(len(lst)):
 buckets[lst[i]-min(lst)] += 1
res=[]
for i in range(len(buckets)):
 if buckets[i] != 0:
  res += [i+min(lst)]*buckets[i]
return res

二、基数排序:

例如,对如下数据序列进行排序。


192,221,12,23

可以观察到它的每个数据至多只有3位,因此可以将每个数据拆分成3个关键字:百位(高位)、十位、个位(低位)。如果按照习惯思维,会先比较百位,百位大的数据大,百位相同的再比较十位,十位大的数据大;最后再比较个位。基数排序方法对任一子关键字排序时必须借助于另一种排序方法,而且这种排序方法必须是稳定的。对于多关键字拆分出来的子关键字,它们一定位于0-9这个可枚举的范围内,这个范围不大,因此用桶式排序效率非常好。

代码:


from random import randint
def radix_sort(lis,d):
for i in xrange(d):#d轮排序
 s = [[] for k in xrange(10)]#因为每一位数字都是0~9,故建立10个桶
 for j in lis:
  s[j/(10**i)%10].append(i)
 li = [a for b in s for a in b]
return li

对数组中的元素按照从低位到高位排序,对于[192,221,12,23]第一轮按照个位数字相同的放在一组,是s[1] =[221],s[2]=[192,12],s[3]=23,第二轮按照十位数字进行排序,s[1]=[12],s[2]=[221,23],s[9]=[192],第三轮按照百位数字进行排序,s[0]=[12,23],s[1]=[192],s[2]=[221]

总结:

桶排序与基数排序常作为桶式排序出现,基数排序进行了多轮的桶排序。桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征:待排序列所有的值处于一个可枚举的范围之类;待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。可以用于学生成绩的排序,因为在若干学生中成绩的范围仅在100以内。

桶式排序的空间开销较大,它需要两个数组,第1个buckets数组用于记录“落入”各桶中元素的个数,进而保存各元素在有序序列中的位置,第2个数组用于缓存待排数据。它只能排整形数组。而且当k较大,而数组长度n较小,即k>>n时,辅助数组C[k+1]的空间消耗较大。

来源:https://blog.csdn.net/iqqiqqiqqiqq/article/details/54837711

标签:python,基数,排序,桶
0
投稿

猜你喜欢

  • selenium WebDriverWait类等待机制的实现

    2022-12-18 13:07:21
  • Python模块汇总(常用第三方库)

    2023-05-21 16:25:37
  • 视觉直观感受若干常用排序算法

    2022-05-09 06:45:24
  • 简单实例解释Oracle分页查询

    2023-07-16 00:54:03
  • python 统计文件中的字符串数目示例

    2022-05-14 11:29:34
  • mysql如何实现多行查询结果合并成一行

    2024-01-19 15:33:38
  • 后端开发使用pycharm的技巧(推荐)

    2021-11-16 14:50:07
  • Python字典的基础操作

    2023-02-27 06:25:18
  • 解决SpringBoot启动过后不能访问jsp页面的问题(超详细)

    2023-06-13 19:43:31
  • Git撤销已经推送(push)至远端仓库的提交(commit)信息操作

    2022-05-31 04:33:28
  • 详解Python Selenium如何获取鼠标指向的元素

    2021-12-03 10:45:39
  • 语言编程花絮内建构建顺序示例详解

    2023-11-04 09:42:12
  • Python进阶之列表推导与生成器表达式详解

    2022-01-18 00:07:04
  • Python 打印中文字符的三种方法

    2022-11-14 10:22:07
  • 微信小程序上传图片到php服务器的方法

    2023-11-07 11:57:25
  • Python实现TOPSIS分析法的示例代码

    2021-05-09 19:32:47
  • pycharm 如何缩进和SQL乱码及SQL包含变量

    2021-05-19 04:43:24
  • 必须会的SQL语句(四) 数据删除和更新

    2024-01-29 02:11:51
  • Python导入不同文件夹中文件的方法详解

    2022-01-22 09:30:08
  • ASP、PHP与javascript根据时段切换CSS皮肤的代码

    2008-09-01 17:26:00
  • asp之家 网络编程 m.aspxhome.com