/在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1(折半查找)/
/*思路:
1.找到数组的中点元素,将数组从中点元素分为左半部和右半部;
2.比较所要找的数与中点元素的大小:
a)若前者大于后者在右半部中重复1和2,直到找到;
b)若前者小于后者在左半部中重复1和2,直到找到;
3.遍历完数组未找到该数,输出提示信息.
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//输入数组大小函数
int Input_size(){
int n;
printf("请输入数组的大小:\n"); //提示用户输入数据
scanf("%d", &n); //保存用户输入数组大小
return n; //返回数组大小
}
//输入数组元素函数
int* Input_elem(int n){
int *p; //定义一个指针p,用来指向新开辟的空间
p = (int*)malloc(sizeof(int)*n); //开辟n个int型的连续动态空间
if (p == NULL){ //若空间开辟失败
printf("空间开辟失败.\n"); //打印输出提示信息
}
printf("请输入数组元素(已排好序):\n"); //提示用户输入数据
for (int i = 0; i < n; ++i){
scanf("%d", &(*(p + i))); //保存用户输入的数组
}
return p; //返回指针p
}
//折半查找函数
int Binary(int *p,int n){
int num; //定义一个变量num,保存用户要查找的数据
printf("请输入你要查的数:\n"); //提示用户输入数据
scanf("%d", &num); //保存用户要查的数num
int left = 0; //定义一个左值变量left
int right = n - 1; //定义一个右值变量right
int mid = (left + right) / 2; //定义一个中间值变量mid,赋值为left和right的中点值
while (mid >= left && mid <= right){ //当mid在left和right之间
if (*(p + mid) < num){ //若以mid为下标的元素值小于num
left = mid + 1; //left更新为mid + 1
mid = (left + right) / 2; //mid更新为新的left和原right的中点值
}
left = mid + 1; //left更新为mid + 1
mid = (left + right) / 2; //mid更新为新的left和原right的中点值
}
else if (*(p + mid) > num){ //若以mid为下标的元素值大于num
right = mid - 1; //right更新为mid - 1
mid = (left + right) / 2; //mid更新为新的right和原left的中点值
}
else if (*(p + mid) == num){ //若以mid为下标的元素值等于num
system("cls"); //调用清屏函数
free(p); //释放开辟的动态空间
return mid; //返回下标mid
}
}
system("cls"); //调用清屏函数
free(p); //释放开辟的动态空间
return -1; //返回-1;
}
//主函数
int main(){
int n = Input_size(); //调用输入数组大小函数,返回值赋值给n
int *p = Input_elem(n); //调用输入数组元素函数,返回值赋值给p
printf("%d\n", Binary(p,n)); //打印输出调用折半查找结果
system("pause");
return 0;
}