Ⅰ 算法之二分法
算法其实就是解决问题的有效方法
'''
二分法使用有前提:数据集必须有先后顺序(升序,降序)
'''
'''
二分法原理
获取数据集中间的元素 比对大小
如果中间元素大于目标数据 那么保留数据集的左边一半
如果中间元素小于目标数据 那么保留数据集的右边一半
针对剩下的数据集再二分
如果中间元素大于目标数据 那么保留数据集的左边一半
如果中间元素小于目标数据 那么保留数据集的右边一半
'''
【1】介绍
二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。
【2】思路
首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤的操作。
如果某一步数组为空,则表示找不到目标元素。
【3】模版
以下是二分法常用的模板,包括查找指定数、查找左边界和右边界。
(1)查找指定数
查找指定数是指只需要查找出指定数在数组中的索引即可,并不规定指定数在数组中所处的相对位置。
l1 = [13,21,32,45,65,74,85,99,123,231,321,412,542,654]
# 查123
target_num = 123
def get_target_num(l1):
# 获取中间元素的索引值只能是整数
middle_index = len(l1)//2
# 判断中间索引值对应的数据与目标数据的大小
if target_num > l1[middle_index]:
# 保留数据集右侧
l1_left = l1[middle_index+1:]
# 对右侧继续二分
print(l1_left)
get_target_num(l1_left)
elif target_num < l1[middle_index]:
# 保留数据集左侧
l1_right = l1[:middle_index]
print(l1_right)
# 对左侧继续二分
get_target_num(l1_right)
else:
print('找到了', target_num)
get_target_num(l1)
# [123, 231, 321, 412, 542, 654]
# [123, 231, 321]
# [123]
# 找到了 123
# 或者是写成形参
l1 = [13,21,32,45,65,74,85,99,123,231,321,412,542,654]
# 查123
def get_target_num(l1,target_num):
# 获取中间元素的索引值只能是整数
middle_index = len(l1)//2
# 判断中间索引值对应的数据与目标数据的大小
if target_num > l1[middle_index]:
# 保留数据集右侧
l1_left = l1[middle_index+1:]
# 对右侧继续二分
print(l1_left)
get_target_num(l1_left,target_num)
elif target_num < l1[middle_index]:
# 保留数据集左侧
l1_right = l1[:middle_index]
print(l1_right)
# 对左侧继续二分
get_target_num(l1_right,target_num)
else:
print('找到了', target_num)
get_target_num(l1,412)
# [123, 231, 321, 412, 542, 654]
# 找到了 412
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 = 6
result = binary_Search(nums, target)
print(result) # 8
# 6所在的索引位置正是 8
Ⅱ 冒泡排序
- 两个数比较大小,较大的数下沉,较小的数冒起来
【1】介绍
两个数比较大小,较大的数下沉,较小的数冒起来。
【2】过程
比较相邻的两个数据,如果第二个数小,就交换位置。
从后向前两两比较,一直到比较最前两个数据。
最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。
继续重复上述过程,依次将第2.3...n-1个最小数排好位置。
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]
标签:index,num,target,冒泡排序,二分法,middle,123,l1
From: https://www.cnblogs.com/zyb123/p/18157880