一、关于二分查找
概念:
- 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
- 使用二分查找的前置条件:待查表为有序表
算法流程:
- 首先,假设表中元素是按升序排列。
- 将表中间位置记录的关键字mid与查找关键字key比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字mid大于查找关键字key,则进一步查找前一子表,否则进一步查找后一子表。
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二、分治算法实现
1. 设计递归方程
现有一含有N个元素的有序数组A(从小到大排列),查找key:
- 获取两个变量left、right,查找开始的时候:设置两个变量left=0,right=N-1;
- 计算数组中间元素下标mid,mid=left+(right-left)/2,比较A[mid]和key的大小;
- A[mid]==key,查找成功
- A[mid]>key,递归查找左半数组A[left,mid-1]
- A[mid]<key,递归查找右半数组A[mid+1,right]
- 重复步骤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. 运行结果展示
三、友情链接~
- 其它一些常见算法请参阅此链接~
最后,非常欢迎大家来讨论指正哦!