使用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之数据类型总结
Sep 24 Python
python中字典(Dictionary)用法实例详解
May 30 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
flask入门之表单的实现
Jul 18 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
Python高级property属性用法实例分析
Nov 19 Python
Pytorch转tflite方式
May 25 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 Python
python 实现图片批量压缩的示例
Dec 18 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读MYSQL中文乱码的解决方法
2006/12/17 PHP
来自phpguru得Php Cache类源码
2010/04/15 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
php正则表达式(regar expression)
2011/09/10 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Django基础三之视图函数的使用方法
2019/07/18 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
拓展培训心得体会
2014/01/04 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
班干部演讲稿
2014/04/24 职场文书
质量承诺书怎么写
2014/05/24 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
讲座通知范文
2015/04/23 职场文书
简单的辞职信模板
2015/05/12 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL