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

二分法,冒泡排序

时间:2024-04-25 15:57:23浏览次数:20  
标签:index num target 冒泡排序 二分法 middle 123 l1

Ⅰ 算法之二分法

算法其实就是解决问题的有效方法

'''
二分法使用有前提:数据集必须有先后顺序(升序,降序)
'''
'''
二分法原理
	获取数据集中间的元素 比对大小
		如果中间元素大于目标数据 那么保留数据集的左边一半
		如果中间元素小于目标数据 那么保留数据集的右边一半
	针对剩下的数据集再二分
		如果中间元素大于目标数据 那么保留数据集的左边一半
		如果中间元素小于目标数据 那么保留数据集的右边一半
'''
【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

相关文章

  • 二分法
    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......
  • 冒泡排序
    packageArray;importjava.util.Arrays;//冒泡排序//1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置//2.每一次比较,都会产生一个最大,或者最小的数字//3.下一轮测试可以少一次排序//4.依次循环,直到结束publicclassDemo06{publicstaticvoid......
  • 排序1-冒泡排序
    排序1-冒泡排序冒泡排序的次数是递减的,第一次确定了最大元素的位置,所以第二次只需要进行n-1次排列,第二次确定了第二大元素的位置,所以第三次只需要进行n-2次排列,以此类推for(inti=0;i<len;i++){//每次遍历的次数是递减的//所以j=len-1-i......
  • python --二分法学习
    deffound_number(need_vaule,l):print(l)mid_index=len(l)//2mid_value=l[mid_index]print("mid_valueis%s"%(mid_value))ifmid_value>need_vaule:l=l[:mid_index]print('needtofind1')......
  • js带注释的冒泡排序算法
    一、简述冒泡排序(BubbleSort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果二者的顺序(如从大到小、首字母从A到Z)错误就交换。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法......
  • 蓝桥杯-跳石头(二分法)
    0.题目题目描述一年一度的「跳石头」比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有N块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至......
  • 常见的排序算法——冒泡排序(二)
    本文记述了冒泡排序微小改动的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想更少的比较可以节省一定的时间,此改动可以减少更小范围的比较。(把水平陈列的数组逆时针旋转90°后,有助于理解后续的内容。)将包含顶层以下的所有元素作为待排序范围......
  • 常见的排序算法——冒泡排序
    本文记述了冒泡排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想(把水平陈列的数组逆时针旋转90°后,有助于理解后续的内容。)将包含顶层以下的所有元素作为待排序范围,将该范围以上的所有元素作为已排序范围。通过一一比较相邻的两个元素,自......
  • lc162 寻找峰值(二分法)
      二分法找部分有序数组题class Solution {    public int findPeakElement(int[] nums) {     int left=0;     int right=nums.length-1;     while(left<right){//因为这道题需要用mid和mid+1比较,所以左右不可以相等否则mid+1会越界  ......
  • Java入门基础知识第八课(数组)——冒泡排序、Arrays工具类
    前面二白讲了关于数组的概念、语法以及简单的输入输出,实际上关于数组的知识还有很多,接下来咱们讲一下冒泡排序以及一些常用的Arrays工具类,需要记忆的知识很多,而且容易混淆。一、冒泡排序简介(原理)升序为例:从头开始,每次比较相邻两数小的交换到前面每轮结束后最大的数交换到......