初学,求助二分搜索算法

yrezer 2003-09-30 09:39:44
已知a[0:n-1]是一个已排好序的数组。改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
...全文
24 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
JimBookWorm 2003-10-05
  • 打赏
  • 举报
回复
//用C++实现的完整代码如下:

#include <iostream.h>

#define N 10

int binary(int, int *, int , int );
int a[N]={2,4,5,7,8,9,11,15,16,17};

int main()
{
int i,j,x,y;
cin >> x;
if ((y=binary(x,a[],i))==0) {j=i; cout << "X Position is " << i;}
else {j=i+1; cout << "X between " << i << " and " << j;}
cout << endl;
}

int binary(int x, int* array, int &pos)
{
int left=0;
int right = N-1;
while (left<right)
{
int mid = (left+right)/2;
if (x < array[mid]) right = mid;
else if (x > array[mid]) left=mid;
else { pos=i ; return 0;}
}
pos=right;
return -1;//找不到时
}
xjxxm 2003-10-05
  • 打赏
  • 举报
回复
void find()
{
if ( x<a[0]) { cout<<"None 0"<<endl; return ; }
if ( x>a[n-1]) { cout<<n-1<<" None"<<endl;return ; }
int l=0; int r=n-1; int mid;
while ( l<=r )
{ mid=(l+r)>>1;
if ( a[mid] <=x ) l=mid+1 ;else r=mid-1;
} l--;
if ( a[l]==x ) cout<<l<<" "<<l <<endl ; else
cout<<l<<" "<<l+1 <<endl;
}
玄豹 2003-09-30
  • 打赏
  • 举报
回复
up,帮你顶!
sanduoren 2003-09-30
  • 打赏
  • 举报
回复
不用改写算法
int binary(int K, int* array, int left, int right) {
int l = left-1;
int r = right+1;
while (l+1 != r) {
int i = (l+r)/2;
if (K < array[i]) r = i;
if (K == array[i])
return i;
if (K > array[i]) l = i;
}
//找不到时,l,l+1就是你想要的位置(以0开始)
return l;
}
playboyxp 2003-09-30
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
int low=0,high=9,m,x,i;
int a[10];
for(i=0;i<=9;i++)
a[i]=i+1;
scanf("%d",&x);
while(low<=high)
{
m=(low+high)/2;
if(x==a[m]) break;
else if(x>a[m]) low=m+1;
else high=m-1;
}
if(low<=high) printf("a[%d]=%d\n",m,x);
else printf("%d is not found\n",x);
}

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧