[算法][二分法查找]
1 /* 2 二分法实验 3 1、设a[0:n-1]是一个已排好序的数组. 4 请改写二分搜索算法,使得当搜索元素x不在数组中时, 5 返回小于x的最大元素的位置I和大于x的最大元素位置j. 6 当搜索元素在数组中时,I和j相同,均为x在数组中的位置. 7 2、设有n个不同的整数排好序后存放于t[0:n-1]中, 8 若存在一个下标I,0<=i<n,使得t[i]=i, 9 设计一个有效的算法找到这个下标. 10 要求算法在最坏的情况下的计算时间为O(logn). 11 */ 12 #include<iostream> 13 using namespace std; 14 /* 15 功能:1\二分查找改进版 16 输入:拍好序的a[],大小n,待查数x,返回参数i,j 17 返回:真:找到 18 */ 19 bool BinarySearch(int *a,int n,int x,int& i,int& j){ 20 int left=0; 21 int right=n-1; 22 while(left<=right){ 23 int mid=(left+right)/2; 24 if(x==a[mid]){ 25 i=j=mid; 26 return true; 27 } 28 if(x>a[mid]) 29 left=mid+1; 30 else 31 right=mid-1; 32 } 33 i=right; 34 j=left; 35 return false; 36 } 37 /* 38 功能:2\高效查找 39 输入:数组,大小,待查值 40 返回:下标,若没有返回-1 41 */ 42 int SearchTag(int *a,int n,int x){ 43 int left=0; 44 int right=n-1; 45 while(left<=right){ 46 int mid=(left+right)/2; 47 if(x==a[mid]) return mid; 48 if(x>a[mid]) 49 left=mid+1; 50 else 51 right=mid-1; 52 } 53 return -1; 54 } 55 int main(){ 56 int n,i,j,a[1000],x; 57 while(cin>>n){//输入数组大小 58 for(i=0;i<n;i++)cin>>a[i];//输入数据,需要从小到大 59 cin>>x;//输入待查数据 60 BinarySearch(a,n,x,i,j);//超找 61 cout<<"用函数1找到的i,j为: "<<'('<<i<<','<<j<<')'<<'\n';//输出对应的i,j 62 cout<<"用函数2找到的下标为: "<<SearchTag(a,n,x)<<"\n\n";//输出2找到的下标 63 }return 0; 64 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?