使用python实现希尔、计数、基数基础排序的代码

作者:Nolinked 时间:2023-07-12 09:02:24 

希尔排序

希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序。

首先取一个整数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实现希尔、计数、基数基础排序网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.cnblogs.com/pungchur/p/12092813.html

标签:python,希尔,排序
0
投稿

猜你喜欢

  • vue3.0使用mapState,mapGetters和mapActions的方式

    2023-07-02 16:49:56
  • SQLServer 设置单词首字母大写

    2024-01-12 20:14:41
  • npm一键安装Python以及node-sass依赖环境的方法

    2024-05-05 09:21:40
  • Python中操作文件之write()方法的使用教程

    2023-12-29 06:06:13
  • 通过Py2exe将自己的python程序打包成.exe/.app的方法

    2021-07-05 11:05:55
  • Oracle 存储过程总结 二、字符串处理相关函数

    2009-07-07 10:28:00
  • asp如何修改WINNT的登录密码?

    2010-06-10 17:06:00
  • golang之数组切片的具体用法

    2024-04-29 13:06:43
  • Linux系统中为php添加pcntl扩展

    2023-09-04 02:58:15
  • python如何删除文件、目录

    2022-02-03 09:28:09
  • python爬取网页转换为PDF文件

    2023-02-11 08:48:24
  • Python logging模块写入中文出现乱码

    2023-10-18 14:48:12
  • Echarts基本入门之柱状图、折线图通用配置

    2024-04-28 09:37:10
  • Kears 使用:通过回调函数保存最佳准确率下的模型操作

    2023-02-24 12:36:56
  • 设置密码保护的SqlServer数据库备份文件与恢复文件的方法

    2011-11-03 16:55:30
  • Oracle时间日期操作方法小结

    2010-11-25 18:04:00
  • 原创一个AJAX类

    2008-07-24 13:29:00
  • 玩转Python图像处理之二值图像腐蚀详解

    2022-09-01 16:23:24
  • Mysql开启慢SQL并分析原因

    2024-01-24 12:03:30
  • golang gorm更新日志执行SQL示例详解

    2024-04-23 09:46:24
  • asp之家 网络编程 m.aspxhome.com