¥二分法和冒泡排序¥

二分法和冒泡排序

【1】介绍

  • 二分法查找,也叫折半法,是一种在有序数组中查找特定元素的搜索算法。

  • 首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

    如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤的操作。 如果某一步数组为空,则表示找不到目标元素。

【2】模版

  • 以下是二分法的模版,包括查找指定数,查找左边界和右边界

(1)查找指定数

  • 查找指定数是指只需要查找出指定数在数组中的索引即可,并不规定指定数在数组中所处的相对位置。

def binary_Search(nums, target):#nums总数据,target值
    left, right = 0, len(nums) - 1  # 搜索区间两边为闭:0,8
    while left <= right:  # 注意停止条件,停止条件为[left, left+1]
        mid = (right + left) // 2 #mid是索引值
        # 找到指定数并返回其索引
        if nums[mid] == target:
            return mid
        elif nums[mid] < target: #nums的索引位置的数字小于target继续执行
            left = mid + 1 
        else:
            right = mid - 1#nums的索引位置的数字大于target继续执行
    return -1
​
​
nums = [1, 8, 9, 7, 4, 5, 3, 1, 6]
target = 6
result = binary_Search(nums, target)
print(result)  # 8
# 6所在的索引位置正是 8
  • 注意

  • while循环的条件left <= right代表中止条件为[left, left+1]

  • 如果不加等号,则中止条件为[left,left]此时left并没有被搜索,是不正确的。

(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 = 6
result = 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 = 6
result = 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个最小数排好位置。

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值