#include<stdio.h>
int search(int key,int a[],int len)
{
int left=0;
int right=len-1;
int ret=-1;
while(left<right){
int mid=(left+right)/2;
if(a[mid]==key){
ret=mid;
break;
}else if(a[mid]<key){
left=mid+1;
}else{
right=mid-1;
}
}
return ret;
}
int main(){
int k=14;
int a[]={1,2,4,9,11,14,17,20,23,25,28,30,34,36,38,39,41,42,46,47,52,54};
int r=search(k,a,sizeof(a)/sizeof(a[0]));
printf("%d",r);
return 0;
}
你这种写法是基于数组有序的前提
mid= low+(high-low)/2
望采纳!谢谢
#include <stdio.h>
int main()
{
int a[15], i, j, n;
int high, mid, x, low = 0;
x = sizeof(a) / sizeof(a[0]);
high = x - 1;
for (i = 0; i <= 14; i++)
scanf_s("%d", &a[i]);
scanf_s("%d", &n);
while (low <= high)
{
mid = low + (high - low) / 2;
if (a[mid] == n)
{
i = mid;
break;
}
else if (a[mid] > n)
high = mid - 1;
else
low = mid + 1;
}
if (n<a[0] && n>a[14])
printf("cannot find %d", n);
else
printf("Has found %d, its position is %d", n, mid+1);
return 0;
}
1.首先,二分查找的应用是基于有序数组
的,你的代码中的数组是不符合的,要改为升序。
2.二分查找的边界
很重要,你的代码还需修改两个地方,完整代码如下:
#include<stdio.h>
int search(int key,int a[],int len)
{
int left=0;
int right=len;//无需len-1
int ret=-1;
while(left<right){
int mid=(left+right)/2;
if(a[mid]==key){
ret=mid;
break;
}else if(a[mid]<key){
left=mid+1;
}else{
right=mid;//直接赋值mid
}
}
return ret;
}
int main(){
int k=26;
int a[]={1,2,3,7,9,14,18,26,48,49,61,63};
int r=search(k,a,sizeof(a)/sizeof(a[0]));
printf("%d",r);
return 0;
}
如有帮助,希望采纳一下