python3冒泡排序代码,python冒泡排序和选择排序

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: