(函数与二分法思想)利用函数实现一个整型有序数组的二分查找
程序员文章站
2022-03-01 18:06:20
...
本题要求利用一个函数实现一个整型有序数组的二分查找。
我的思路如下: (以数组元素从小到大排列输入为例)
(1)首先编写主函数
int main()
{
int scan[10]; //定义一个数组,从外界获取数值
int target; //定义一个整型变量,从外界获得数值
int i = 0,j = 0; //定义循环中的参数
int length = sizeof(scan) / sizeof(scan[0]); //计算数组中元素个数 (这里定义为10个,可更改)
printf("请输入一个元素为10的整型数组:");
for(i = 0; i < 10; i++) {
scanf("%d", &scan[i]);
}
printf("请输入你想查找的元素:");
scanf("%d",&target);
int num = search(scan,target,length); //调用函数search,用函数寻找目标值
// 若找到了该数值 返回该数的次序(次序从1开始,用 “下标+1” 的方式表示)
// 若找不到该数值 返回一个不与数组下标冲突的数值(如-1)
if (num != -1)
printf("该元素是第%d个元素", num);
else
printf("无法找到该元素!");
return 0;
}
2.编写函数
int search(int a[], int target, int sum)
{
int left = 0; //左下标
int right = sum - 1; //右下标
//左下标的值与右下标的值圈定了一个区间 如:left = 0;right = 3表示 a[0] a[1] a[2] a[3] 在此范围内查找目标值
while (left <= right) {
int mid = (left + right) / 2; //首先找到该数组的中间元素的下标
if (a[mid] < target) { //若该元素小于目标值 说明目标值下标大于mid
left = mid + 1;
}
else if (a[mid] > target) { //若该元素大于目标值 说明目标值小于mid
right = mid - 1;
}
else {
return(mid+1); //若该元素与目标值相等 则返回它的序号 回到主程序中
}
}
return -1; //若所有元素均被扫描仍然未找到目标值 则返回-1
}
3.若将主函数置于自定义函数之上,则需编写函数声明。我习惯于将自定义函数置于主函数之前,避免忘记声明而引起错误。
以下为代码整体:
#include<stdio.h>
int search(int a[], int target, int sum)
{
int left = 0;
int right = sum - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] < target) {
left = mid + 1;
}
else if (a[mid] > target) {
right = mid - 1;
}
else {
return(mid+1);
}
}
return -1;
}
int main()
{
int scan[10];
int target;
int i = 0,j = 0;
int length = sizeof(scan) / sizeof(scan[0]);
printf("请输入一个元素为10的整型数组:");
for(i = 0; i < 10; i++) {
scanf("%d", &scan[i]);
}
printf("请输入你想查找的元素:");
scanf("%d",&target);
int num = search(scan,target,length);
if (num != -1)
printf("该元素是第%d个元素", num);
else
printf("无法找到该元素!");
return 0;
}
新手小白,欢迎指正~