排序算法的python实现

简介:

本文所有的排序方法都在列表上进行操作,首先定义交换任意两项位置的函数swap

 

def swap (x,i,j):
"""
交换x的i,j位置元素
"""
temp = x[i]
x[i] = x[j]
x[j] = temp

1、选择排序

排序算法的逻辑非常简单,首先搜索整个列表,找到最小项的位置,如果该位置不是列表的第1项,就交换这两个位置的元素。然后从列表的第2个元素开始,重复上述过程,直到算法达到整个过程的最后一个位置,图形解释如下

1c0beeb20b21458b9200a68772394b3db7a3d208

代码如下

 

def selectionSort (x):
i = 0
while i < len(x) - 1 :
minindex = i
j = i + 1
while j < len(x) :
if x[minindex] > x[j]:
minindex = j
j+= 1
if minindex != i:
swap(x,i,minindex)
i+= 1
return x

函数包括一个嵌套的循环,对于大小为n的列表,外围的循环执行n-1次,内部循环的次数从n-1递减到1,因此,选择排序在各种情况下的复杂度为平方阶,运行结果如下

5c60fb52fd995b309e1bc8c2aebc8b8b3a624824

2、二元选择排序法(选择排序改进)

选择排序法每轮只找最小值,效率较低,可以考虑每次同时寻找最小值和最大值,并且在某一轮如果最小值与最大值相同,说明剩下的数字都相同,可以直接结束。

此外,与选择排序不同的是,需要考虑到如果第i轮里,恰好第i个数就是最大值时,先交换minindexi之后,最大值的下标变成了minindex,这时候应该交换minindexn-i-1,而不是maxindexn-i-1。代码如下

 

def selectionSort_1( x ):
i = 0
while i <= len ( x ) // 2 :
minindex = i
maxindex = i
j = i + 1
while j < len ( x ) - i :
if x [minindex] > x [ j ]:
minindex = j
if x [maxindex] < x [ j ]:
maxindex = j
j += 1
if x [minindex] == x [maxindex]:
return x
if minindex != i:
swap( x ,i,minindex)
if maxindex != len ( x ) - 1 - i :
if maxindex != i:
swap( x , len ( x ) - 1 - i,maxindex)
else :
swap( x , len ( x ) - 1 - i, minindex)
i+= 1
return x
3、冒泡排序

冒泡排序从列表的开头处开始,逐个比较一对数据项,如果顺序不对就交换两项位置,直到移动到列表的末尾。这个过程的效果就是将最大的项以冒泡的方式排到算法的末尾。然后算法从列表开头到倒数第二项重复这一过程,依次类推,图形解释如下。

8bb3720ad96c18ae118c2db88390a3aead85c661

代码如下

 

def BubbleSort (x):
j = len(x) - 1
while j > 0 :
i = 0
while i < j:
if x[i] > x[i + 1 ]:
swap(x,i,i+ 1 )
i += 1
j -= 1
return x

类似选择排序,冒泡排序也是一个嵌套的循环,如果列表是已经排好序的,冒泡排序不会执行任何的交换,在最坏的情况下,为平方阶复杂度。

4、冒泡排序法改进

在最好的情况下,冒泡排序法依然会执行每个循环但不进行任何操作,可以设定一个标记判断冒泡排序法在一次内层循环中是否进行了交换,如果没有,说明算法已经使排好序的,就可以直接返回,不过这种方法只是对最好的情况进行了改进,代码如下

 

def BubbleSort_1 (x):
j = len(x) - 1
while j > 0 :
flag = False
i = 0
while i < j:
if x[i] > x[i + 1 ]:
swap(x,i,i+ 1 )
flag = True
i += 1
if not flag:
return x
j -= 1
return x
5、双向冒泡排序法

冒泡排序法存在所谓的“乌龟问题”,假设我们需要将序列按照升序排序。序列中的较小的数字又大量存在于序列的尾部,这样会让小数字在向前移动得很缓慢,因此针对这一问题,产生了双向冒泡排序法,也称鸡尾酒排序法。

双向冒泡排序法由两个方向同时进行冒泡,首先由左向右为大元素移动方向,从右向左为小元素移动方向,然后每个元素都依次执行。在第i次移动后,前i个和后i个元素都放到了正确的位置。图形解释如下

c9f94747aec3ed5a555f9b9f4e8452d7b85edc6b

代码如下

 

def BidirectionalBubbleSort (x):
j = 0
while j <= len(x)// 2 :
flag = False
for i in range(j ,len(x) - j - 1 ):
if x[i]>x[i+ 1 ]:
swap(x,i,i+ 1 )
flag= True
for i in range(len(x)- 1 - j,j, -1 ):
if x[i]<x[i -1 ]:
swap(x,i,i -1 )
flag= True
if not flag:
return x
j += 1
return x

实验结果如下

d3f14d8533cf162c1b7cbe6533f59a7771cda6c0

6、插入排序法

插入排序法类似打牌时候摸扑克牌整理顺序的过程,逻辑如下:

 ●  在第 i 轮通过列表的时候( i 1 n-1 ),第i项应该插入到列表的前i个项中的正确位置;
 ●  在第 i 轮之后,前 i 个项应该是排好序的;

图形解释如下

f680ffc465374c2b06b4c13d71a24f507255087b

代码如下

 

def InsertionSort (x):
i = 1
while i < len(x):
j = i - 1
item = x[i]
while j >= 0 and item < x[j]:
x[j + 1 ] = x[j]
j -= 1
x[j + 1 ] = item
i += 1
return x
7、希尔排序(插入排序改进)

插入排序对于几乎已经排好序的数据操作时,效率很高,但平均来说,插入排序很低效,因为插入排序每次只能将数据移动一位,希尔排序是在此基础上对于插入排序的一种改进。

希尔算法的逻辑是,先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序,具体步骤如下:

 ●   设定一个较大间隔 gap ,对所有间隔为 gap 的数据通过插入排序法进行排序;
 ●   执行完之后根据某种逻辑缩小 gap 代码中采用除以3取整的办法),重复上述过程,直到 gap = 0

通过以上步骤,最终得到的列表是排好序的,并且可以证明,这种方法的平均的复杂度是O(nlogn)。代码如下

 

def HashSort( x ):
gap = round ( len ( x )* 2 / 3 )
while gap > 0 :
print ( 'gap = ' ,gap )
i = gap
while i < len ( x ):
j = i - gap
item = x [i]
while j >= 0 and item < x [ j ]:
x [ j + gap] = x [ j ]
j -= gap
x [ j + gap] = item
i += 1
gap = round (gap/ 3 )
return x

这里print每次循环中gap的值,可以直观看到gap的变化过程,实验如下

894d322531e2e3e0f26f6d34a6c2d3356446fef1

关于各种方法效率的比较不再说明,其余排序方法下期再见,代码有问题的地方请指出!


原文发布时间为:2018-11-28

本文作者:量化小白H

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

相关文章
|
18天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
201 55
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
101 66
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
138 67
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
128 61
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
117 63
|
28天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
152 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
47 20
|
3天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
8天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
40 5
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用