【分治】二分查找(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. 运行结果展示

运行截图

三、友情链接~


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值