二分查找:
基本思路:
首先将给定的关键字key与表array的中间位置的元素进行比较。如果相等,则查找成功,如果不相等,则查找的元素一定在表的前半部分或者后半部分。继续缩小范围到前半部分或者后半部分再进行同样的查找,直到找到为止,或者查完之后仍然没有找到元素。
情况一:表array为容器
#include<iostream>
#include<vector>
using namespace std;
int Binary_search(vector<int> vec,int key)
{
int not_find = -1;
int left = 0, right = vec.size()-1;
int mid;
while (left<=right) //相等时继续查找
{
mid = (left + right) / 2; //mid也参与循环,每次再left与right之间
if (vec[mid]>key)
right = mid - 1;
else if (vec[mid] < key)
left = mid + 1;
else return mid;
}
return not_find;
}
int main()
{
int a[13] = {5,16,39,45,51,98,100,202,226,321,368,444,501};
int len = sizeof(a) / (sizeof(a[0]));
vector<int>vec;
for (int i = 0; i < len; i++)
vec.push_back(a[i]);
cout << Binary_search(vec, 39)<<endl;
return 0;
}
情况二:表array为数组
数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别是:
不允许拷贝数组以及使用数组时通常会将其转换成指针。因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数。因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
主函数传递给其他函数的数组是一个数组首地址的指针,并不知道数组长度,所以将数组长度也作为形参之一,一并传入
#include<iostream>
#include<vector>
using namespace std;
int Binary_search(int a[], int key,int len) //数组作为函数形参,由于实参自动地转换成指向首元素的指针,所以需要传递数组长度
{
int not_find = -1;
int left = 0, right = len - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (a[mid] == key)
return mid;
else if (a[mid] > key)
right = mid - 1;
else
left = mid + 1;
}
return not_find;
}
int main()
{
int a[13] = { 5, 16, 39, 45, 51, 98, 100, 202, 226, 321, 368, 444, 501 };
int len = sizeof(a) / (sizeof(a[0]));
cout << Binary_search(a, 321,len) << endl;
return 0;
}
插值查找:
将计算mid 公式改为
mid = left + (right - left)*(key - a[left]) / (a[right] - a[left]);
代码如下
#include<iostream>
using namespace std;
int insert_search(int a[], int key,int n)
{
int not_found = -1;
int left = 0, right = n - 1;
int mid;
while (left <= right)
{
mid = left + (right - left)*(key - a[left]) / (a[right] - a[left]);
if (a[mid] > key)
right = mid - 1;
else if (a[mid] < key)
left = mid + 1;
else
return mid;
}
return not_found;
}
int main()
{
int a[13] = { 5, 16, 39, 45, 51, 98, 100, 202, 226, 321, 368, 444, 501 };
int len = sizeof(a) / (sizeof(a[0]));
cout << insert_search(a, 226,len) << endl;
return 0;
}