6-13 折半查找 (15分)

本文详细介绍了一个严格递增数列中使用二分查找算法查找特定值的过程。提供了完整的C++实现代码,包括创建有序表、输入数据及二分查找函数。通过实例展示了如何查找一个值在数列中的位置。
部署运行你感兴趣的模型镜像

给一个严格递增数列,函数int Search_Bin(SSTable T, KeyType k)用来二分地查找k在数列中的位置。

函数接口定义:

int  Search_Bin(SSTable T, KeyType k)

 

其中T是有序表,k是查找的值。

裁判测试程序样例:


#include <iostream>
using namespace std;

#define MAXSIZE 50
typedef int KeyType;

typedef  struct                     
{ KeyType  key;                                             
} ElemType;  

typedef  struct
{ ElemType  *R; 
  int  length;
} SSTable;                      

void  Create(SSTable &T)
{ int i;
  T.R=new ElemType[MAXSIZE+1];
  cin>>T.length;
  for(i=1;i<=T.length;i++)
     cin>>T.R[i].key;   
}

int  Search_Bin(SSTable T, KeyType k);

int main () 
{  SSTable T;  KeyType k;
   Create(T);
   cin>>k;
   int pos=Search_Bin(T,k);
   if(pos==0) cout<<"NOT FOUND"<<endl;
   else cout<<pos<<endl;
   return 0;
}

/* 请在这里填写答案 */

 

输入格式:

第一行输入一个整数n,表示有序表的元素个数,接下来一行n个数字,依次为表内元素值。 然后输入一个要查找的值。

输出格式:

输出这个值在表内的位置,如果没有找到,输出"NOT FOUND"。

输入样例:

5
1 3 5 7 9
7

 

输出样例:

4

 

输入样例:

5
1 3 5 7 9
10

 

输出样例:

NOT FOUND
​int  Search_Bin(SSTable T, KeyType k)
{
 	int low=0,high=T.length-1,mid;
 	while(low<=high)
 	{
  		mid=(low+high)/2; 
  		if(T.R[mid].key==k)
   			return mid;
  		if(k>T.R[mid].key)
   			low=mid+1;
  		else
   			high=mid-1;
     }
 	return 0;
}​

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,用户需要查找关于折半查找算法的实现,特别是作者为wgy,单位为浙江大学的相关资料。首先,我需要确认用户提供的引用中是否有直接相关的信息。查看引用内容,发现引用[1]提到折半查找的实现,引用[2]和[3]讨论二查找的逻辑和实现,引用[4]和[5]则提供了具体的代码示例和步骤。不过,这些引用中并没有明确提到作者wgy或浙江大学的信息。接下来,考虑用户可能的需求。用户可能希望获得折半查找的标准实现方法,并可能误以为存在由特定作者或机构提供的版本。由于公开资料中没有记录具体的实现者信息,尤其是个人作者如wgy,可能需要引导用户参考通用的实现方法,并提及浙江大学可能有相关的教学材料或课程内容。 此外,用户提供的示例代码和步骤与常见的折半查找实现一致,因此可以推测用户需要的是标准的算法实现步骤,可能来自教材或课程资源。需要结合引用中的代码示例,整理出结构清晰的实现步骤,并指出可能的优化点,如整数溢出处理,这在引用[3]中提到过。 最后,生成相关问题时应围绕算法实现、优化、应用场景等方面,帮助用户进一步了解折半查找的相关知识。</think>根据您的要求,关于浙江大学wgy老师可能使用的折半查找算法实现,结合公开教学资源中的常见实现方式,整理实现步骤如下: ### 折半查找算法实现步骤 1. **预处理要求**:需在有序数组中进行查找(升序或降序排列)[^5] 2. **边界初始化**: - 左边界$left=0$(数组起始索引) - 右边界$right = n-1$(数组末尾索引) 3. **循环查找**: ```c while(left <= right){ int mid = left + (right - left)/2; // 防整数溢出[^3] if(arr[mid] == target) return mid; else if(arr[mid] < target) left = mid + 1; else right = mid - 1; } ``` 4. **返回结果**: - 找到元素时返回索引位置 - 未找到返回-1,并输出比较次数[^1] ### 浙江大学OJ风格实现样例 (参考SWUSTOJ题型[^1][^4]) ```c #include <stdio.h> #define NOT_FOUND -1 int binary_search(int arr[], int n, int key, int *count){ int left = 0, right = n-1; *count = 0; while(left <= right){ int mid = left + (right - left)/2; (*count)++; if(arr[mid] == key) return mid+1; // 位序从1开始 else if(arr[mid] < key) left = mid + 1; else right = mid - 1; } return NOT_FOUND; } int main(){ int n, key; scanf("%d", &n); int arr[n]; for(int i=0; i<n; i++) scanf("%d", &arr[i]); scanf("%d", &key); int cmp_count; int pos = binary_search(arr, n, key, &cmp_count); printf("%d\n%d", pos, cmp_count); return 0; } ``` ### 关键特性说明 1. **防整数溢出**:使用$mid = left + (right - left)/2$代替$(left+right)/2$,避免大数相加溢出[^3] 2. **比较次数统计**:通过指针参数返回比较次数[^1] 3. **位序转换**:返回结果时+1转换C语言索引为人类可读位序[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值