数据结构------查找之折半查找

数据结构------查找之折半查找

1.折半查找又称二分查找,仅适用于有序的顺序表。
2.基本思想:首先将给定值与与表中中间位置的元素进行比较,若相等则查找成功,并返回该元素在表中的的位置;若不相等,则所要查找的元素只能在中间元素以外的前半部分或后半部分,然后在前半部分或后半部分进行同样的查找,如此重复,直到找到为止。
例如,给定一个表,该表中数据元素分别为1 2 3 4 5 6 7 8 9 共9个数,中间值元素mid设置为5,5的前半部分元素为1 2 3 4,后半部分元素为6 7 8 9,假设要查找3,发现3<5,于是便在前半部分1 2 3 4 中查找,同时设置新的中间值元素mid值为2,2的前半部分为1,后半部分为3和4,对比发现2小于要查找的元素3,于是便在3和4中查找,于是新的中间值元素mid变成了3,对比发现mid(此时为3)等于要查找的元素3,此时查找成功,返回元素3的位置)
3.代码实现,如下图(相关注释已在代码中标明):
#include<iostream>
using namespace std;
#define maxSize 10
typedef int elemType;

//定义一个线性表的结构体,新的结构体名为ssTable
typedef struct{
	elemType data[maxSize];//表中的数组用来存储数据
	int tableLen=maxSize;//表的长度
}ssTable;

int midSearch(ssTable ST,elemType key)//折半查找函数
{
	int low=0;//low初始值设置为0,表示表中第一个元素
	int high=ST.tableLen-1;//hign初始值设置为表的长度减1,表示表中最后一个元素
	int mid;//中间值
	while(low <= high)
	{
		mid=(low+high)/2;//首次查找时,mid表示表中中间值元素
		if(ST.data[mid] == key)//查找成功返回mid所在位置
		{
			return mid+1;
		}else if(ST.data[mid] < key)//mid所表示的元素小于要查找的值时,在前半部分进行查找
		{
			low=mid+1;
		}else//mid所表示的值大于要查找的值时,在后半部分进行查找
		{
			high=mid-1;
		}
	}
	return -1;

}

int main()
{
	ssTable sst;
	elemType e;
	elemType b;
	cout<<"请依次往表中输"<<maxSize<<"个元素: ";
		for(int i=0;i<maxSize;i++)
		{
			cin>>e;
			sst.data[i]=e;
			cin.get();
		}
		cout<<"您输入的"<<maxSize<<"个元素分别为:";
			for(int i=0;i<maxSize;i++)
			{
				cout<<sst.data[i]<<" ";
			}
		cout<<endl;
		cout<<"请输入要查找的元素: ";
		cin>>b;
		int result=midSearch(sst,b);
		if(result==-1)
		{
			cout<<"列表中没有该元素"<<endl;
		}else
		{
			cout<<"元素'"<<b<<"'在第"<<result<<"个"<<endl;
		}
	return 0;
}
4.运行结果:

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值