使用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 相关文章推荐
python使用PyV8执行javascript代码示例分享
Dec 04 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
如何通过Python实现标签云算法
Jul 02 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
pyqt5中动画的使用详解
Apr 01 Python
python实现文字版扫雷
Apr 24 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
超详细Python解释器新手安装教程
May 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
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
jquery中this的使用说明
2010/09/06 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
档案接收函范文
2014/01/10 职场文书
国培教师自我鉴定
2014/02/12 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
革命电影观后感
2015/06/18 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android