使用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的Django框架中的模版继承
Jul 16 Python
python批量提取word内信息
Aug 09 Python
Python实现的求解最大公约数算法示例
May 03 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Python上下文管理器用法及实例解析
Nov 11 Python
python生成大写32位uuid代码
Mar 03 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
Python try except finally资源回收的实现
Jan 25 Python
总结Python使用过程中的bug
Jun 18 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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 三维饼图的实现代码
2008/09/28 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
linux中cd命令使用详解
2015/01/08 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
web 页面分页打印的实现
2009/06/22 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python中list循环语句用法实例
2014/11/10 Python
Python中的super用法详解
2015/05/28 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
详解python3中tkinter知识点
2018/06/21 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Python接口开发实现步骤详解
2020/04/26 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
如何利用python读取micaps文件详解
2020/10/18 Python
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
优秀应届毕业生推荐信
2014/02/18 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
购房个人委托书范本
2014/10/11 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Nginx配置使用详解
2022/07/07 Servers