python3冒泡排序代码,python冒泡排序和选择排序
参考:《数据结构(Python 语言描述)》-3.3搜索算法
学习思路分三个层次进行:学习算法设计思路和实现算法复杂度分析。
提示:为了保持简洁,假设每个函数只处理一个整数列表,并且该列表不为空。
找到最小值
搜索最小值
下面的函数返回列表中最小项目的索引。算法的复杂度为o(n)。
最小定义索引(lyst):
""返回最小项目的索引" "
min_index=0
当前索引=1
wilecurrent_indexLen(lyst):
if lyst [当前索引] lyst [最小索引]:
最小索引=当前索引
当前索引=1
返回最小索引
2.顺序搜索
顺序搜索也称为线性搜索。
如果需要使用in来测试对象的成员,则必须实现该对象的__contains__()方法。真实;如果对象包含指定项,则为;否则,它返回False。以下顺序搜索函数提供列表中__contains__()方法类的功能。
defsequential_search(target,lyst):
如果找到“”目标项,则返回索引。否则,返回-1
位置=0
无线定位(lyst):
if target==lyst[position]:
返回位置
位置=1
返回-1
2.1最佳情况、最差情况和一般情况
最佳情况、最差情况和一般情况下的性能
有些算法与数据的排列有关,如顺序搜索算法。此时,可以从三种情况来考虑算法的性能。
最坏的情况:对于“按顺序搜索”,最坏的情况是目标项在列表的末尾或者不在列表中。此时,您需要访问列表中的每一项。对大小为n的列表进行n次迭代,因此,在最坏的情况下,连续探索的复杂度为o(n)。
最好的情况:“依次搜索”只需要一次迭代就可以找到第一个位置的目标项。复杂度为o(1)。
平均情况:从“最好情况”到“最坏情况”所有可能情况的迭代次数必须相加并除以n,因此算法平均重复(1)2) 3…n-1n )/n次,简化后变成(n-1)/2。对于大n,常数因子2影响不大。所以一般情况的复杂度还是o(n)。
3.二进位检索
二进位检索
二分搜索法也称为二分搜索法,对于有序列表,其时间复杂度为o(log_{2}n)。
假设你需要使用三叉搜索来寻找一个升序列表。首先,四边形对齐算法将找到列表中的中间项,并将其与目标项进行比较。如果两者匹配,则返回中间项的索引。如果目标项小于中间项,则继续搜索列表的前半部分。如果没有,搜索下半部分。如果找到目标,或者索引的起点值大于终点值,则停止搜索。
请注意,使用二分搜索法时有一个总成本,即必须保持列表的顺序。
然后,采用“循环模式”和“递归模式”实现叉搜索。
3.1流通模式
#-*-编码:utf-8-*-
def binary _ search _ loop(sorted _ list:list,target: int):
""
子搜索,循环模式
:param sorted_list:升序列表
:零件目标:搜索到的目标项目。
如果3360return:sorted_list包含target,则返回target的索引值;否则,不返回任何内容
""
低=0
high=len(sorted_list )- 1
而低=高:
中点=(低高)/2
if sorted _ list [ mid _ point ]=目标:
返回中点
elif排序列表[中点]目标:
高=中点- 1
否则:
低=中点1
回答
urn None
if __name__==__main__ :
我的列表=[1,2,3,4]
断言binary_search_loop(my_list,1)==1
断言binary_search_loop(my_list,2)==1
断言binary_search_loop(my_list,3)==2
断言binary_search_loop(my_list,4)==3
断言binary_search_loop(my_list,10)为None
3.2递归模式
基线条件:数组只包含一个元素。如果目标值与该元素相同,则在最终基线条件下找到目标值,否则目标值不在数组中。
递归条件:每次将数组分成两半,丢弃一半,对剩下的一半再次执行二分搜索法。
# -*-编码:utf-8 -*-
def binary _ search _ recursive(sorted _ list:list,target: int):
两点搜索,递归方式
:param sorted_list:按升序列出。
:param target:要查找的目标项目。
:return:如果sorted_list包含target,则返回target的索引值;否则,不返回任何值。
mid=(len(sorted_list) - 1) //2
Len (sorted _ list)==1: #基线条件
if target==sorted_list[0]:
返回0
否则:
不返回
Elitarget==sorted _ list [mid]: #基线条件
返回mid
#下面的代码通过递归逐渐缩小了问题的规模。
if target sorted_list[mid]:
index=binary _ search _ recursive(sorted _ list[mid 1:],目标)
如果索引为无:
不返回
#减半的新列表sorted_list[mid 1:]将再次从索引0开始,
#这里需要确保返回的索引值包含当前排序列表的索引信息,
#所以需要重新调整index中的index值。
#要将index中的索引值调整到sorted_list列表中的相应位置,
#需要将(mid 1)添加到索引
回报指数(中1)
否则:
index=binary_search_recursive(排序列表[:mid],目标)
回报指数
if __name__==__main__ :
assert binary _ search _ recursive(my _ list,1)==0
assert binary _ search _ recursive(my _ list,2)==1
assert binary _ search _ recursive(my _ list,3)==2
assert binary _ search _ recursive(my _ list,4)==3
assert binary _ search _ recursive(my _ list,10)为None
3.3最坏情况
当目标物品不在列表中时,最坏的情况将会发生。在最坏的情况下,对于大小为N的列表,列表的长度将除以2,直到商为1(例如,n//2//./2=1).3354除法的次数是循环执行的总次数。假设除法的次数为k,则有n/2 k=1,可得k=log_2n。因此,二分搜索法的最坏情况复杂度是O(log_2n)。
下图是用二分搜索法在只包含1~9的整数列表中寻找整数10的过程。灰色项表示中间项,用于与目标项进行比较,即将要访问的项。此外,初始列表前半部分的项目实际上并没有被访问。
二分搜索法。png
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。