使用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格式化压缩后的JS文件的方法
Mar 05 Python
Python使用shelve模块实现简单数据存储的方法
May 20 Python
Python读写配置文件的方法
Jun 03 Python
python中argparse模块用法实例详解
Jun 03 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Django中间件实现拦截器的方法
Jun 01 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
如何在Anaconda中打开python自带idle
Sep 21 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 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 foreach正序倒序输出示例代码
2014/07/01 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
Python 中判断列表是否为空的方法
2019/11/24 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
车间主管岗位职责
2013/11/14 职场文书
前台文员岗位职责及工作流程
2013/11/19 职场文书
项目采购员岗位职责
2014/04/15 职场文书
吨的认识教学反思
2014/04/27 职场文书
公司演讲稿开场白
2014/08/25 职场文书
支行行长竞聘报告
2014/11/06 职场文书
八年级英语教学计划
2015/01/23 职场文书
教师外出学习心得体会
2016/01/18 职场文书
实验心得体会范文
2016/01/25 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS