数组:折半查找

题目描述

有15个整数按由小到大顺序存放在一个数组中,输入一个整数,要求用折半查找法找出该数在数组中首次出现的序号(序号从1开始计)。如果该数不在数组中,则输出-1

输入

先输入15个已升序排列的整数并存入数组,再输入一个要查找的整数。

输出

用折半查找法找出该数在数组中首次出现的序号(序号从1开始计)。

如果该数不在数组中,则输出-1

样例输入

3 7 12 18 22 31 50 65 77 80 83 89 91 95 97

89

样例输出

12

解答:

#include<stdio.h>

int main(){

int data[15];

int i,j,N,flag=0,mid;

printf(“请输入十五个数和需要查找的数:\n”);

for(i=0;i<15;i++){

scanf(” %d\n”,&data[i]);

}

scanf(“%d”,&N);

i=0;

j=14;

//i为数组的首项,j为数组的末项,首项加末项/2=中间项;得到中间项后组成一个新的数列,以中间项为首项或者末项再与需要查找的数进行比较,如果还不能得出答案,则继续首项加末项/2;

//为什么i<=j;因为是一项一项的检验,所以末项不可能小于首项;

while(i<=j){

mid=(i+j)/2;

if(data[mid]>N){

j=mid-1;

}

else if(data[mid]<N){

i=mid+1;

}

else if(data[mid]==N){

printf(“该数在数组中的序号为:%d”,mid+1);

flag=1;

break;

}

}

if(flag==0){

printf(“-1”);

}

return 0;

}