使用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 学习笔记
Dec 27 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python Crypto模块的安装与使用方法
Dec 21 Python
python提取包含关键字的整行数据方法
Dec 11 Python
python django model联合主键的例子
Aug 06 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
Python Selenium截图功能实现代码
Apr 26 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
用python画城市轮播地图
May 28 Python
python神经网络ResNet50模型
May 06 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 substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
document.all与WEB标准
2020/05/13 Javascript
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
服务器安全设置的几个注册表设置
2007/07/28 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
python模块restful使用方法实例
2013/12/10 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python实现媒体播放器功能
2018/02/11 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Python callable内置函数原理解析
2020/03/05 Python
公司成本主管岗位责任制
2014/02/21 职场文书
银行实习推荐信
2015/03/27 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python