【分治】二分查找(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]
  3. 重复步骤2,直到查找成功或查找失败。

2. 编写程序代码

// 二分查找
#include

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. 运行结果展示

【分治】二分查找(C++)_第1张图片

三、友情链接~

  • 其它一些常见算法请参阅此链接~

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

你可能感兴趣的:(算法分析与设计,-,学习记录,算法,c++)