首页 > 其他分享 >二分法、冒泡排序

二分法、冒泡排序

时间:2024-05-07 20:22:25浏览次数:14  
标签:边界 nums 冒泡排序 二分法 查找 排序 data

【一】二分法

  • 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法
  • 思路:
    • 首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
    • 如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤的操作。
    • 如果某一步数组为空,则表示找不到目标元素
  • 模板
    • 以下是二分法常用的模板,包括查抄指定数、查找左边界和右边界。

(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 = 6
result = binary_Search(nums, target)
print(result)  # 8
# 6所在的索引位置正是 8
  • 注意:
  • 主要是要理解左边界查找和查找指定数的区别,在查找指定数时nums[mid] == target表示已经找到指定数,则返回该数索引即为结果。
  • 而在左边界查找时nums[mid] == target并不能表示已经得到结果,因为我们不知道这个数是不是最左边的,所以当nums[mid] == target时我们要将右边界设置为mid - 1,再次进行循环。

(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 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

【二】冒泡排序

  • 两个数比较大小,较大的数下沉,较小的数冒起来。
  • 过程:
    • 比较相邻的两个数据,如果第二个数小,就交换位置。
    • 从后向前两两比较,一直到比较最前两个数据。
    • 最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。
    • 继续重复上述过程,依次将第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]

标签:边界,nums,冒泡排序,二分法,查找,排序,data
From: https://www.cnblogs.com/chosen-yn/p/18178309

相关文章

  • 冒泡排序法(从左到右升序 )
    /**@filename: main.c@brief冒泡排序@[email protected]@date2024/05/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)[email protected]*///冒泡排序,指的是元素两两之间进行比较交......
  • 冒泡排序
    冒泡排序冒泡排序也被称为起泡排序,该排序算法的原理就是经过一系列的交换实现的,也就是用第一个元素和第二个元素进行比较,如果第一个元素的值大于第二个元素则两者位置互换,否则不交换。然后第二个元素和第三个元素比较.......最后序列中最大的元素被交换到了序列的尾部,这样就完成......
  • 冒泡排序
    数据结构冒泡排序//元素两两之间进行比较交换,需要比较n轮,每轮需比较m次,从左向右升序voidbubbleSort(intbuf[],intbufsize){inttemp=0;//临时存放交换值for(intn=1;n<bufsize;++n)//每轮需要比较n次{for(intm=0;m<bufsize-n;++m)//比较m轮......
  • 冒泡排序
    数据结构冒泡排序1.冒泡算法思想:冒泡排序也被称为起泡排序,该排序算法的原理就是经过一系列的*交换*实现的,也就是用第一个元素和第二个元素进行比较,如果第一个元素的值大于第二个元素则两者位置互换,否则不交换。然后第二个元素和第三个元素比较.......最后序列中最大的元素被交......
  • dotnet 冒泡排序
    //Seehttps://aka.ms/new-console-templateformoreinformationusingConsoleApp1;Console.WriteLine("Hello,World!");//我委托你办事情,作为委托方只要满足被委托方的规则的事情(也就是方法),他都可以帮我解决,我需要给它提供金钱(也就是参数)。//总结:就是一些常用(公用的......
  • 冒泡排序
    冒泡排序:也就是用第一个元素和第二个元素进行比较,如果第一个元素的值大于第二个元素则两者位置互换,否则不交换。然后第二个元素和第三个元素比较.......最后序列中最大的元素被交换到了序列的尾部,这样就完成了一轮交换,经过n轮交换之后,就可以得到一个有序序列。#include<stdio.h>......
  • 冒泡排序
    /*******************************************************************************************************@filename: :BubbleSort*@brief :冒泡排序*@author :[email protected]*@date :2024/04/30*@version1.0 :V1.0*@prop......
  • 利用二分法删除数组中元素
    二分法的思想主要是要设定起始值和终点值,计算中值,和给定值进行比较,如果大于给定值,则将中值作为终点值,否则作为起始值,重新计算中值。#include<stdio.h>intmain(){intarray[10]={1,2,3,5,8,15,20,30,100,200};intfirst=0,end=9,middle=(first+end)/2,num,i;s......
  • 二分法,冒泡排序
    Ⅰ算法之二分法算法其实就是解决问题的有效方法'''二分法使用有前提:数据集必须有先后顺序(升序,降序)''''''二分法原理 获取数据集中间的元素比对大小 如果中间元素大于目标数据那么保留数据集的左边一半 如果中间元素小于目标数据那么保留数据集的右边一半 针对剩......
  • 二分法
    defbinary_find(list,target):left,right=0,len(list)whileleft<=right:mid=(left+right)//2print(list[mid])list_left=list[left:mid]print(list_left)list_right=list[mid+1:right]print(list_right)iftarget......