查找:线性结构的二分查找

简介


查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。
线性结构、树、图的查找都不一样。
线性结构的顺序查找就不多说了,这里总结线性结构的二分查找。

二分查找


二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

非递归实现


先用循环实现二分查找。下面的代码里还含有顺序查找。
#include 
using namespace std;

int main () {

	const int N = 10;
	int A[N] = {1,2,2,3,5,7,11,23,55,78};
	
	int value = 23;
	
	bool b = false;

	 //顺序查找
 	for (int i = 0;i value) { // value在前一半
 			high = mid - 1;
 		}
 	}
 	if (!b)
 	{
 		cout<<"没有找到"<

递归实现


用很让我头疼的递归来写一下二分查找。
// 返回的是value在A中的下标。如果不存在,返回-1。
int biSearch(int A[],int low, int high, int value) {

	if (low <= high) // 还需要继续查找
	{
		int mid = low + (high - low)/2;
		int temp = A[mid];
		if (temp == value)
		{
			cout<<"找到了"< value) {
			return biSearch(A,low,mid-1,value); // 对前一半继续找
		}
	}

	return -1; // 没有找到的终止条件
}
// 递归 二分法查找主函数里的代码
	int idx = biSearch(A,0,N-1,value);
	if (idx==-1)
	{
		cout<<"没有找到"<
每次用递归,都会让我对结果表示很怀疑,尽管结果确实是对的。
又来把一堆废话写一遍。每写一遍,都有进步,都能加深我对递归的理解。
1. 终止条件。
(1) 找到的终止条件。--> A[mid] == value,就可以返回mid了。这是最简单的问题,已经解决了。
(2) 没找到的终止条件。
2. 递推关系
(1)如果要找的数还在后半段,就把问题分解,对后一半进行递归。return xxx就好…
(2)如果要找的数还在左半段,就对左一半递归。

你可能感兴趣的:(算法)