二分查找的条件:
1:查找的内容得是有序的
2:查找的数量唯一
最核心的二分查找:
#include<stdio.h>
int main()
{
int a[13]={5,16,39,45,51,98,100,202,226,321,368,444,501};
int b;
scanf("%d",&b);
int lift=0,right=12;
int mid;
while(lift<=right)
{
mid=(lift+right)/2;
if(a[mid]>b)
right=mid-1;
else if(a[mid]<b)
lift=mid+1;
else
{
printf("下标为%d",mid);
break;
}
}
if(lift>right)
printf("未找到");
return 0;
}
自由输入数组,前提输入的数组得是有序的:
#include<stdio.h>
int main()
{
int a[100];
int b,i;
int n=0;
for(i=0;i<100;i++)
{
scanf("%d",&a[i]);
n++;
if(getchar()=='\n')
{
break;
}
}
scanf("%d",&b);
int lift=0,right=n;
int mid;
while(lift<=right)
{
mid=(lift+right)/2;
if(a[mid]>b)
right=mid-1;
else if(a[mid]<b)
lift=mid+1;
else
{
printf("下标为%d",mid);
break;
}
}
if(lift>right)
printf("未找到");
return 0;
}
加入排序,从小到大排序:
#include<stdio.h>
int main()
{
int a[100];
int b,i,j,t;
int n=0;
for(i=0;i<100;i++)
{
scanf("%d",&a[i]);
n++;
if(getchar()=='\n')
{
break;
}
}
//从小到大排序
for(i=0;i<n;i++)
{
for(j=n-1;j>=i;j--)
{
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("你要查找的数是:");
scanf("%d",&b);
int lift=0,right=n;
int mid;
while(lift<=right)
{
mid=(lift+right)/2;
if(a[mid]>b)
right=mid-1;
else if(a[mid]<b)
lift=mid+1;
else
{
printf("在第%d位:",mid+1);
break;
}
}
if(lift>right)
printf("未找到");
return 0;
}