【分治】二分查找(C++)

一、关于二分查找

概念:

  1. 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
  2. 使用二分查找的前置条件:待查表为有序表

算法流程:

  1. 首先,假设表中元素是按升序排列。
  2. 将表中间位置记录的关键字mid与查找关键字key比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字mid大于查找关键字key,则进一步查找前一子表,否则进一步查找后一子表。
  3. 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二、分治算法实现

1. 设计递归方程

现有一含有N个元素的有序数组A(从小到大排列),查找key:

  1. 获取两个变量left、right,查找开始的时候:设置两个变量left=0,right=N-1;
  2. 计算数组中间元素下标mid,mid=left+(right-left)/2,比较A[mid]和key的大小;
    1. A[mid]==key,查找成功
    2. A[mid]>key,递归查找左半数组A[left,mid-1]
    3. A[mid]<key,递归查找右半数组A[mid+1,right]
  3. 重复步骤2,直到查找成功或查找失败。

2. 编写程序代码

// 二分查找
#include<iostream>

using namespace std;

int BinarySearch(int array[], int x, int y, int key);

int main()
{
    int n;                      // 进行二分查找序列的元素个数
    int key;                    // 要求查找的元素

    cout << "请输入进行二分查找序列的元素个数:";
    cin >> n;

    int* array = new int[n];    // 进行二分查找的序列
    for (int i = 0;i < n;i++) {
        cout << "#" << i+1 << ":";
        cin >> array[i];
    }
    cout << "请输入要求查找的元素:";
    cin >> key;
    
    cout << "\n“" << key << "”是第 " << BinarySearch(array, 0, n-1, key) + 1 << " 个元素!" << endl;
    
    delete[] array;

    return 0;
}

// 递归
int BinarySearch(int array[], int left, int right, int key)
{
    int mid = (left + right)/2;   // 待查序列中间位置元素值
    
    if (left > right)   //查找完毕没有找到,返回-1
        return -1;
    else
    {
        if (array[mid] == key)
            return mid;
        else if (array[mid] > key)
            return BinarySearch(array, left, mid - 1, key);
        else
            return BinarySearch(array, mid + 1, right, key);
    }
}

// 非递归
int BinarySearch2(int array[], int key, int n)
{
	int left = 0;
	int right = n-1;
	while(left <= right)
	{
		int mid = (left + right)/2;
		if(key == a[mid])
			return mid;
		else if(key > a[mid])
			left = mid + 1;
		else
			right = mid - 1;
	}
 
	return -1;
}

3. 运行结果展示

运行截图

三、友情链接~


最后,非常欢迎大家来讨论指正哦!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分治算法是一种将问题分解为更小部分并递归求解的算法。而二分查找分治算法的一种应用。在二分查找中,我们首先将数组分成两部分,然后判断待查找的数与中间元素的大小关系,进而确定待查找数在哪一部分,然后再在该部分进行递归查找。这种方法能够快速地定位到待查找数。 在给出的C代码实现中,我们可以看到二分查找算法的递归实现。代码中通过比较待查找的数与中间元素的大小关系,来决定是继续在左半部分还是右半部分进行查找。如果找到了待查找数,则返回对应的索引值;如果没有找到,则返回-1。 在提供的测试代码中,我们可以看到如何调用二分查找函数来查找数组中的元素。通过传入数组的地址、查找范围的最小下标和最大下标以及待查找的数,我们可以得到该数在数组中的索引值。 所以,根据分治算法二分查找的实现原理,我们可以使用C语言来实现分治算法中的二分查找。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C/C++ 分治算法(二分查找算法递归实现)](https://blog.csdn.net/cpp_learner/article/details/126613516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值