《Python零基础快乐学习之旅》学习笔记16——算法-排序与搜寻

素颜马尾好姑娘i 2022-10-27 01:40 317阅读 0赞

第16章 算法-排序与搜寻

16.1 算法(alogrithm)

算法是指一个寻求解答的过程的程序代码。

程序实例:

  1. # 寻找最大值的算法
  2. data = [10, 25, 38, 69, 83]
  3. max = data[0]
  4. for num in data:
  5. if num > max:
  6. max = num
  7. print("最大值:", max)

执行结果:

  1. 最大值: 83

16.2 排序

在排序方法中最著名也最简单的算法是泡沫排序法(Bubble Sort)或者叫冒泡排序。其基本原理是将相邻的元素进行比较,如果前一个元素的值大于后一个元素,则交换两个元素的位置,这样经过一次循环后,最大的元素会被放到最右边,持续这样的动作,直到所有的元素都被排好顺序。

冒泡排序算法如下:

  1. for i in range(0, len(列表)): # 外层循环
  2. for j in range(0, len(列表) - 1 - i): # 内层循环
  3. if 列表[j] > 列表[j+1]:
  4. 交换列表[j]与列表[j+1]的内容

程序实例:

  1. def bubbleSort(nLst):
  2. length = len(nLst)
  3. for i in range(length-1):
  4. print("第 %d 次外圈排序" % (i+1))
  5. for j in range(length-1-i):
  6. if nLst[j] > nLst[j+1]:
  7. nLst[j],nLst[j+1] = nLst[j+1],nLst[j]
  8. print("第 %d 次内圈排序:" % (j+1), nLst)
  9. return nLst
  10. data = [32, 19, 66, 81, 4]
  11. print("原始列表:", data)
  12. print("排序结果:", bubbleSort(data))

执行结果:
在这里插入图片描述

16.3 搜寻(search)

16.3.1 顺序搜寻法(sequential search)

也叫顺序查找,将数据逐个拿来与搜寻值(key)做比对,直到找到与搜寻值相同的数据或是所有数据搜寻结束为止。它的演算方法如下:

  1. for i in range(len(列表)):
  2. if key == 列表[i]
  3. return i

程序实例:

  1. def sequentialSearch(nLst):
  2. for i in range(len(nLst)):
  3. if nLst[i] == key:
  4. return i # 返回索引值
  5. return -1 # 找不到,返回-1
  6. data = [1, 3, 5, 7, 24, 13]
  7. key = int(input("请输入搜寻值:"))
  8. result = sequentialSearch(data)
  9. if result != -1:
  10. print("在 %d 索引位置找到了 %d,共找了 %d 次" % (result, key, (result+1)))
  11. else:
  12. print("未找到该值!")

执行结果:
在这里插入图片描述

16.3.2 二分搜寻法(binary search)

要执行二分搜寻法,首先要对数据进行排序(从小到大排),然后将搜寻值(key)与中间值进行比较,如果搜寻值大于中间值,则下一次往右边(较大值边)搜寻,否则往左边(较小值边)搜寻。上述动作持续进行,直到找到搜寻值或是所有数据搜寻结束才停止。它的演算方法如下:

  1. # 默认已将搜寻数据排序存至列表
  2. middle = int((low + high) / 2) # low为排序后第一个元素值的索引,high为最后一个元素值的索引,通过运算获得中间索引值
  3. search_count = 0 # 将搜寻次数设为0
  4. while True:
  5. search_count += 1 # 搜寻次数加1
  6. if key == list[middle]: # 若key的值与list[middle]相等,置result的值为middle,离开循环,搜寻结束
  7. result = middle
  8. break
  9. elif key > list[middle]: # 若key的值大于list[middle]的值,说明list[middle]前面的值都比key小
  10. low = middle + 1 # 下一次需往右搜寻,修改low索引值
  11. else:
  12. high = middle - 1 # 下一次需要往左搜寻,修改high索引值
  13. middle = int((low + high) / 2) # 更新中间索引
  14. if low > high: # 所有元素比较结束
  15. result = -1
  16. break

程序实例:

  1. def binarySearch(nLst):
  2. print("打印搜寻列表:",nLst)
  3. low = 0 # 最小索引,初始值为列表的最小索引值
  4. high = len(nLst) - 1 # 最大索引,初始值为列表的最大索引值
  5. middle = int((low + high) / 2) # 中间索引
  6. search_count = 0 # 搜寻次数
  7. while True:
  8. search_count += 1
  9. if key == nLst[middle]:
  10. result = middle
  11. break
  12. elif key > nLst[middle]:
  13. low = middle + 1 # 下一次往右搜寻
  14. else:
  15. high = middle - 1 # 下一次往左搜寻
  16. middle = int((low + high) / 2) # 更新中间索引
  17. if low > high: # 所有元素比较结束
  18. result = -1
  19. break
  20. return result, search_count
  21. data = [24, 18, 7, 23, 31, 49, 37, 5, 13, 21]
  22. sequentialData = sorted(data) # 对列表进行排序
  23. key = int(input("请输入搜寻值:"))
  24. index, times = binarySearch(sequentialData)
  25. if index != -1:
  26. print("在 %d 索引位置找到了 %d,共找了 %d 次" % (index, key,times))
  27. else:
  28. print("未找到该值!")

执行结果:
在这里插入图片描述


往期文章:

  • 《Python零基础快乐学习之旅》学习笔记2——认识变量与基本数学运算
  • 《Python零基础快乐学习之旅》学习笔记3——Python的基本数据类型
  • 《Python零基础快乐学习之旅》学习笔记4——基本输入与输出
  • 《Python零基础快乐学习之旅》学习笔记5——程序的流程控制使用if语句
  • 《Python零基础快乐学习之旅》学习笔记6——列表(list)
  • 《Python零基础快乐学习之旅》学习笔记7——循环设计
  • 《Python零基础快乐学习之旅》学习笔记8——元组(tuple)
  • 《Python零基础快乐学习之旅》学习笔记9——字典(dict)
  • 《Python零基础快乐学习之旅》学习笔记10——集合(set)
  • 《Python零基础快乐学习之旅》学习笔记11——函数设计
  • 《Python零基础快乐学习之旅》学习笔记12——类-面向对象
  • 《Python零基础快乐学习之旅》学习笔记13——模块的设计与应用
  • 《Python零基础快乐学习之旅》学习笔记14——文档的读取与写入
  • 《Python零基础快乐学习之旅》学习笔记15——程序调试与异常处理

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读