算法
1190 字
6 分钟
算法
【一】二分法
【1】介绍
- 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。
【2】思路
- 首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
- 如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤的操作。
- 如果某一步数组为空,则表示找不到目标元素。
【3】模版
以下是二分法常用的模板,包括查找指定数、查找左边界和右边界。
(1)查找指定数
- 查找指定数是指只需要查找出指定数在数组中的索引即可,并不规定指定数在数组中所处的相对位置。
def binary_Search(nums, target): left, right = 0, len(nums) - 1 # 搜索区间两边为闭 while left <= right: # 注意停止条件,停止条件为[left, left+1] mid = (right + left) // 2 # 找到指定数并返回其索引 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 # 因为mid已经搜索过 else: right = mid - 1 return -1
nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]target = 6result = binary_Search(nums, target)print(result) # 8# 6所在的索引位置正是 8- 此处要注意的是:
- while循环的条件left <= right代表中止条件为[left, left+1]。
- 如果不加等号,则中止条件为[left,left]此时life并没有被搜索,是不正确的。
(2)左边界查找
- 左边界查找是指需要查找出指定数在数组中第一次出现的位置的索引。
def left_Search(nums, target): left, right = 0, len(nums) - 1 # 搜索区间两边为闭 while left <= right: mid = (right + left) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 if left >= len(nums) or nums[left] != target: return -1 return left
nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]target = 6result = left_Search(nums, target)print(result) # 8# 6所在的索引位置正是 8- 此处要注意的是:
- 主要是要理解左边界查找和查找指定数的区别,在查找指定数时nums[mid] == target表示已经找到指定数,则返回该数索引即为结果。
- 而在左边界查找时nums[mid] == target并不能表示已经得到结果,因为我们不知道这个数是不是最左边的,所以当nums[mid] == target时我们要将右边界设置为mid - 1,再次进行循环。
(3)右边界查找
- 右边界查找跟左边界类似,只不过右边界需要的是查找出最后一次出现的位置的索引。
def left_Search(nums, target): left, right = 0, len(nums) - 1 # 搜索区间两边为闭 while left <= right: mid = (right + left) // 2 if nums[mid] <= target: left = mid + 1 else: right = mid - 1 if right < 0 or nums[right] != target: return -1 return right
nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]target = 6result = left_Search(nums, target)print(result) # 8# 6所在的索引位置正是 8- 此处要注意的是:
- 主要是要理解右边界查找和左边界查找的区别,在左边界查找时nums[mid] == target我们要去查找左边的区间是否有指定数,所以当nums[mid] == target时我们要将右边界设置为mid - 1,再次进行循环。
- 而在右查找时我们要去查找右边的区间是否有指定数,所以当nums[mid] == target时我们要将左边界设置为mid - 1
【二】冒泡排序
【1】介绍
- 两个数比较大小,较大的数下沉,较小的数冒起来。
【2】过程
- 比较相邻的两个数据,如果第二个数小,就交换位置。
- 从后向前两两比较,一直到比较最前两个数据。
- 最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。
- 继续重复上述过程,依次将第2.3…n-1个最小数排好位置。
【3】实现
def bubble_sort(data): for i in range(len(data)): print(f'这是后{i}趟') for j in range(len(data) - 1 - i): if data[j] > data[j + 1]: data[j], data[j + 1] = data[j + 1], data[j] print('差的排序结果为:>>>', data)
start_list = [3, 9, 3, 1, 7, 7]bubble_sort(start_list)
# 这是后0趟# 差的排序结果为:>>> [3, 3, 1, 7, 7, 9]# 这是后1趟# 差的排序结果为:>>> [3, 1, 3, 7, 7, 9]# 这是后2趟# 差的排序结果为:>>> [1, 3, 3, 7, 7, 9]# 这是后3趟# 差的排序结果为:>>> [1, 3, 3, 7, 7, 9]# 这是后4趟# 差的排序结果为:>>> [1, 3, 3, 7, 7, 9]# 这是后5趟# 差的排序结果为:>>> [1, 3, 3, 7, 7, 9]支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
C 语言发展史
编程语言了解 C 语言从 BCPL、B 语言到现代标准 C 的发展历程、核心特点与应用领域。
2
C 语言开发环境的安装与配置
编程语言在 Windows、Linux 与 macOS 上安装 C 工具链,配置编辑器,并编译运行第一个 C 程序。
3
C 语言初识:程序运行机制与基本结构
编程语言认识 C 程序从源代码到运行的完整流程,以及基础语法和程序的基本结构。
4
C 语言基础:注释、关键字、变量与数据类型
编程语言学习 C 语言的注释、关键字、标识符、常量、变量和基本数据类型等基础知识。
5
C 语言数据类型
编程语言理解 C 语言的数据类型体系,包括基本类型、整数类型、浮点类型和逻辑类型。
随机文章随机推荐














