使用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中字典和JSON互转操作实例
Jan 19 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
pandas的object对象转时间对象的方法
Apr 11 Python
详解python做UI界面的方法
Feb 27 Python
利用python求积分的实例
Jul 03 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
Python实现动态循环输出文字功能
May 07 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
如何利用pygame实现打飞机小游戏
May 30 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
JS实现在线ps功能详解
2019/07/31 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
javascript实现评分功能
2020/06/24 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python并行分布式框架Celery详解
2018/10/15 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
洗发露广告词
2014/03/14 职场文书
献爱心标语
2014/06/21 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA