有序顺序表的查找——整理好的物品怎么快速找到呢?

书籍被摆放在书架之中,书架被一个个标好了序号,整齐的排列在一起。走进这图书馆之中,寻找着心怡的书籍,当然可以从头走到尾一个个找下去,可是也许有其他更好的方法呢?

这是来自线性表(顺序表、链表)的简单方法,基于其下标和顺序性,查找着键值为给定值的元素或结点


1.二分查找

或许书籍已经按照价格大小排列整齐,而预算有限,书籍太多,找到一本价格合适的书籍,从头走到尾或许不太合适,直接走到书架的中间部分,比较书籍的价格和自己的预算价格,就能知道自己想要的价格区间该去哪里找了

1.算法1-1
功能:给定具有n个元素的顺序表sl,确定是否存在键值为k的元素
算法步骤
(1)定义两个整型变量left和right,分别表示当前子区间的下标区间的左端点和右端点,初始值为0和n-1
(2)如果left>right,当前子表为空,查找失败,结束;否则计算当前子表下标的中间点mid=(left+right)/2,并比较sl[mid]与k的大小,分为以下3种情况:

  1. 如果sl[mid]=k,查找成功,结束
  2. 如果sl[mid]>k,则k只能出现在左半区间,令right=mid-1,进入第(2)步
  3. 如果sl[mid]<k,则k只能出现在右半区间,令left=mid+1,进入第(2)步

2.示例与代码
给定有序顺序表sl={3,4,6,8,10,12,14,16,18,20}中查找键值为14的元素下标

#include<iostream>
#include<vector>
using namespace std;
//二分查找,查找顺序表sl的下标区间中是否存在值为k的元素,存在返回下标,否则返回-1
int binary_search(vector<int>sl, int left, int right, int k) {
   
	int mid;
	if (left > right)return -1;//查找失败
	mid = (right + left) >> 1;//下标区间的中间位置,等价于(right+left)/2
	if (sl[mid] == k)return mid;//查找成功
	else if (sl[mid]>k)return binary_search(sl, left, mid - 1, k);//转到左半区间查找
	else return binary_search(sl, mid + 1, right, k);//转到右半区间查找
}
//二分查找的非递归实现,查找顺序表sl的下标区间中是否存在值为k的元素,存在返回下标,否则返回-1
int binary_search_no(vector<int>sl, int k) {
   
	int left = 0, right = sl.size() - 1, mid;
	while (left <= right) {
   
		mid = (right + left) >> 1;//下标区间的中间位置,等价于(right+left)/2
		if (sl[mid] == k)return mid;//查找成功
		else if (sl[mid]>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值