折半查找

China☆狼群 提交于 2020-02-21 07:08:53

折半查找

折半查找(Binaryear)也称二分查找,它是一种效率较高的查找 但是折半查找要求线性表必须采用顺序储存结构,而且表中元素按关键字有序排列
折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
为了标记查找过程中每一次的查找区间,下面分别用lowhigh来表示当前查找区间的下界和上界,mid为区间的中间位置。折半查找每一次在找比较都使查找范围缩小一半,与顺序查找相比,很显然会提高查找效率。

代码如下:

	/*
	折半查找的前提是存在已经排好序的序列
	*/
	#include<iostream>
	using namespace std;
	
	typedef int KeyType;//key类型
	
	typedef struct
	{
		KeyType key;//关键字
		KeyType other;//其他信息
	}ElemType;
	
	//顺序表结构
	typedef struct
	{
		ElemType* p;
		int length;
	}STable;
	//顺序表结构
	
	//创建顺序表
	void CreateTable(STable& T)
	{
		cout << "请输入顺序表的长度:";
		cin >> T.length;
		T.p = new ElemType[T.length];
		cout << "请输入顺序表的关键字信息:";
		for (int i = 0; i < T.length; i++)
		{
			cin >> T.p[i].key;
		}
	}
	//创建顺序表
	
	//折半查找
	int Search(STable T,KeyType key)
	{
		int low = 0;//序列头
		int high = T.length - 1;//序列尾
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (T.p[mid].key == key) return mid;
			else if (T.p[mid].key > key)
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
	}
	//折半查找
	
	int Search_Rec(STable T, KeyType key,int low,int high)//递归算法
	{
		int mid = (low + high) / 2;
		if (T.p[mid].key == key) return mid;
		else if (T.p[mid].key > key)
		{
			high = mid - 1;
			Search_Rec(T, key, low, high);
		}
		else
		{
			low = mid + 1;
			Search_Rec(T, key, low, high);
		}
	}
	int main()
	{
		STable T;
		CreateTable(T);
		cout << "请输入你要查找的关键字:";
		KeyType key;
		cin >> key;
		cout << "关键字所在位置为:"<< Search_Rec(T, key,0,T.length-1);
		return 0;
	}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!