14、折半查找法
#include<stdio.h>
int main(){
int n[15], i, x, right, left, mid, find, position;
printf("请按照由大到小的顺序输入15个数:\n");
i=0;
find=0;
for(i=0; i<15; i++){
scanf("%d", &n[i]); //注意%d后不要加空格,否则要输入16个数
}
printf("请输入要查找的数:\n");
scanf("%d", &x);
left=0;
right=14;
while(left <= right){ //注意是<=
//有等号的情况:从5个数中找:一开始left=0,right=4——mid=2,(假设数据由大到小排列,要找的数x等于第2个数a[1]),之后left=0,right=mid-1=1——mid=0,再之后left=mid+1=1,right=1,回到while(left<=right),此时left和right相等,为真——mid=1——找得。
//没有等号的情况:从3个数中找,一开始left=0,right=2——mid=1,(假设数据从小到大排列,要找的数x等于第1个数a[0]),之后left=0,right=mid-1=0,回到while(left<right),但left和right相等,为假——没找得。
mid = (left+right)/2;
if(x == n[mid]){
find=1;
position = mid;
break;
}else{
if(x>n[mid]){
right = mid-1;
}else{
left = mid+1;
}
}
}
if(find == 1){
printf("%d是第%d个数", x, position);
}else{
printf("没有这个数");
}
return 0;
}