使用python实现希尔、计数、基数基础排序的代码


Posted in Python onDecember 25, 2019

希尔排序

希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序。

首先取一个整数d1=n//2,将元素分为d1个组,每组相邻元素之间的距离为d1,在各组内进行直接插入排序。

取第二个整数d2=d1//2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。

希尔排序是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。

使用python实现希尔、计数、基数基础排序的代码

实现

# 希尔排序
def shell_sort(li):
  n = len(li)
  gap = n // 2
  while gap > 0:
    for i in range(gap, n):
      temp = li[i]
      j = i - gap
      while j >= 0 and li[j] > temp:
        li[j + gap] = li[j]
        j -= gap
      li[j + gap] = temp

    gap //= 2

算法分析

  • 时间复杂度:O(n1.3)
  • 最好时间复杂度:O(n)
  • 最坏时间复杂度:O(n2)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

计数排序

计数排序是一种非比较性质的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。
计数排序过程中不存在元素之间的比较和交换操作,根据元素本身的值,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置。

  1. 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;
  2. 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
  3. 对额外空间内数据进行计算,得出每一个元素的正确位置;
  4. 将待排序集合每一个元素移动到计算得出的正确位置上。

使用python实现希尔、计数、基数基础排序的代码

实现

def count_sort(li, max_num=100):
  count = [0 for _ in range(max_num + 1)]

  for val in li:
    count[val] += 1
  li.clear()
  # 表示i这个数出现了v次
  for i, v in enumerate(count):
    for _ in range(v):
      li.append(i)

算法分析

假定原始数列的规模是N

最大值和最小值的差是M

计数排序的时间复杂度是O(N+M)

如果不考虑结果数组,只考虑中间数组大小的话,空间复杂度是O(M)

基数排序

基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

多关键字排序:现在有一个员工,要求按照薪资排序,年龄相同的员工按照按照年龄排序。

先按照年龄进行排序,再按照薪资进行稳定的排序。

对32,13,94,52,17,54,93进行排序,是否可以看作多关键字排序?

使用python实现希尔、计数、基数基础排序的代码

实现

# 基数排序
def radix_sort(li):
  max_num = max(li)
  i = 0
  while (10 ** i <= max_num):
    buckets = [[] for _ in range(10)]
    for val in li:
      # i=0 个位 i=1 十位 i=2 百位 ..
      digit = val // (10**i) % 10
      buckets[digit].append(val)
    li.clear()
    for bucket in buckets:
      for val in bucket:
        li.append(val)
    i += 1

算法分析

  • 时间复杂度:O(kn)
  • 最好时间复杂度:O(kn)
  • 最坏时间复杂度:O(kn)
  • 空间复杂度:O(n+k)
  • 稳定性:稳定

总结

以上所述是小编给大家介绍的使用python实现希尔、计数、基数基础排序,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
详解Python3中的Sequence type的使用
Aug 01 Python
Python遍历numpy数组的实例
Apr 04 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
Python中类的创建和实例化操作示例
Feb 27 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
PyQt5显示GIF图片的方法
Jun 17 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
Python 依赖库太多了该如何管理
Nov 08 Python
Django中提示消息messages的设置方式
Nov 15 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python实现mean-shift聚类算法
Jun 10 Python
Python之Class&amp;Object用法详解
Dec 25 #Python
python shutil文件操作工具使用实例分析
Dec 25 #Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 #Python
如何基于python测量代码运行时间
Dec 25 #Python
python字典setdefault方法和get方法使用实例
Dec 25 #Python
Python 内置变量和函数的查看及说明介绍
Dec 25 #Python
python @propert装饰器使用方法原理解析
Dec 25 #Python
You might like
深入PHP内存相关的功能特性详解
2013/06/08 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python实现二维插值的三维显示
2018/12/17 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python中logger日志模块详解
2020/08/04 Python
Django实现随机图形验证码的示例
2020/10/15 Python
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
大专生工程监理求职信
2013/10/04 职场文书
大学在校生求职信范文
2013/11/21 职场文书
迎国庆演讲稿
2014/09/05 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
服务员岗位职责
2015/02/03 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
财务管理制度范本
2015/08/04 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python
Java死锁的排查
2022/05/11 Java/Android