顺序表查找之二分查找

二分查找使用前提:
1、线性表中的记录必须是关键码有序(一般由大到小)
2、线性表必须采用顺序存储

3、有序存储的顺序表是静态查找表,即不需要频繁的执行插入或者删除操作

时间复杂度:O(logn)

#include <stdio.h>
#include <iostream>
using namespace std;
int Binary_Search(int *a, int n, int key)
{
	int low, mid, high;
	low = 1;
	high = n;
	
	while (low <= high)
	{
		mid = (low + high) / 2; //mid = low + 0.5(high - low)  传统的二分查找
		//mid = low + (key - a[low]) / (a[high] - a[low]) * (high - low); //差值查找
		if (key > a[mid])
		{
			low = mid + 1;
		}
		else if (key < a[mid])
		{
			high = mid - 1;
		}
		else 
		{
			cout << "Search success!" << endl;
			return mid;
		}
	}
	if (low > high)
	{
		cout << "Search Failed!" << endl;
		return -1;
	}

}
int _tmain(int argc, _TCHAR* argv[])
{

	int pos1 = Binary_Search(a, 5, 81); //Success test
	cout << "pos1 = " << pos1 << endl;
	int pos2 = Binary_Search(a, 5, 5);  //Failed test
	cout << "pos2 = " << pos2 << endl;

	system("pause");
	return 0;
}
        二分查找中,根据割点选择方法的不同,有三种常见的算法,分别是:折半查找、差值查找和斐波那契查找。三种算法中,因为折半查找和差值查找的差异最小,所以我们将两者放在一起描述,斐波那契查找以后再单独描述。上述代码中,当分割位置mid用:mid = (low + high) / 2(即:mid = low + 0.5(high - low))确定时,就是折半查找;当mid用:mid = low + (key - a[low]) / (a[high] - a[low]) * (high - low)确定时,就是差值查找。
        所谓差值查找(Interpolation Search),核心在于要根据所要查找的关键字key与查找表中最大最小记录的关键字进行比较,其核心在于插值的计算公式:(key - a[low]) /(a[high] - a[low]) 。其时间复杂度也是O(logn)。那么我们为什么要使用差值查找?举个例子,如果我们要在取值范围0~1000之间100个元素从小到大均匀分布的数组中查找5,我们当然不会从中间开始查起,我们当然会考虑从数组下标较小的开始查找。因此,对于那些表长较大,而且关键字分布又比较均匀的查找表来说,差值查找的平均性能要比折半查找好得多。

你可能感兴趣的:(二分查找,ds)