二分查找 插值查找

二分查找:

基本思路:

首先将给定的关键字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;
}

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/82745247
今日推荐