使用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制作获取网站目录的图形化程序
May 04 Python
Python lxml模块安装教程
Jun 02 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
详解Python self 参数
Aug 30 Python
python多进程重复加载的解决方式
Dec 13 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 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获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
python读取mysql数据绘制条形图
2020/03/25 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
用Python 执行cmd命令
2020/12/18 Python
python中pdb模块实例用法
2021/01/15 Python
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
员工试用期考核自我鉴定
2014/04/13 职场文书
股东协议书范本
2014/04/14 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
python pyhs2 的安装操作
2021/04/07 Python
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
Go语言读取txt文档的操作方法
2022/01/22 Golang
详解Python内置模块Collections
2022/03/22 Python