使用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 os模块学习笔记
Jun 21 Python
python清除字符串里非字母字符的方法
Jul 02 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
Python socket实现简单聊天室
Apr 01 Python
django自带的server 让外网主机访问方法
May 14 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
python 调用有道api接口的方法
Jan 03 Python
python实现自动解数独小程序
Jan 21 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Pytorch DataLoader shuffle验证方式
Jun 02 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 header()函数使用说明
2008/07/10 PHP
php生成随机密码的几种方法
2011/01/17 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
求职推荐信范文
2013/12/01 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
中国梦口号
2014/06/13 职场文书
三八活动策划方案
2014/08/17 职场文书
夏季药店促销方案
2014/08/22 职场文书
道德与公民自我评价
2015/03/09 职场文书
立案决定书范文
2015/06/24 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
python数字类型和占位符详情
2022/03/13 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL