折半查找
折半查找(Binaryear)也称二分查找,它是一种效率较高的查找 但是折半查找要求线性表必须采用顺序储存结构,而且表中元素按关键字有序排列。
折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
为了标记查找过程中每一次的查找区间,下面分别用low和high来表示当前查找区间的下界和上界,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;
}
来源:CSDN
作者:A三三
链接:https://blog.csdn.net/m0_43456002/article/details/104417650