1.对代码实现步骤的分析:
二分:一分为二,可以理解为将要查找的有序整数数组一分为二,每次判断一半
2.对函数变量的设计:
分析:我们要查找的是一个整数数组,所以函数需要一个数组来接收。
同时我们需要两个变量来确定数组的两端,所以我们需要数组的
长度来确定指向数组最后的变量,我们也需要一个变量来接收要查找的数据。
我们也可让函数返回下标来确定查找数字的位置这样,我们就确定了函数
的形参和返回值。
int binary_sort(int arr[], int len, int n)
{
}
3.对主函数的实现
分析:首先我们需要建立有序数组,求出数组的长度(这里我们可以使用sizeof操作符
来实现)
int main()
{
//建立有序数组,也可输入
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//求出数组的长度
int len = sizeof(arr) / sizeof(arr[0]);
//输入要查找的数
int n = 0;
scanf("%d", &n);
//函数调用和判断
int ret = binary_sort(arr, len, n);
if (ret >= 0)
{
printf(" 找到了:arr[%d] = %d\n",ret, n);
}
else
{
printf("没找到\n");
}
return 0;
}
4.对函数内部的实现
1.确定指向数组两端的指针
我们可以通过定义两个整型变量当作下标来实现
int binary_sort(int arr[], int len, int n)
{
//确定两个变量来指向数组两端
int left = 0;
int right = len - 1;
}
2.查找逻辑的实现
二分查找,顾名思义,我们需要确定数组的中间值,来判断中间变量与查找数字
的大小关系。
int binary_sort(int arr[], int len, int n)
{
//确定两个变量来指向数组两端
int left = 0;
int right = len - 1;
//确定中间值
int mid = (left + right) / 2;
//确定中间值与要查找的数的关系
if (arr[mid] > n)
{
}
else if(arr[mid] < n)
{
}
else
{
}
}
判断完 arr[mid]与所要查找的数的大小关系后,我们的left和right要移动
通过代码实现:
int binary_sort(int arr[], int len, int n)
{
//确定两个变量来指向数组两端
int left = 0;
int right = len - 1;
//确定中间值
int mid = (left + right) / 2;
//确定中间值与要查找的数的关系
if (arr[mid] > n)
{
right = mid - 1;//这里-1是因为mid指向的数据也是大于查找数据的
}
else if(arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid;
}
}
这一我们仅仅完成了一次查找,想要完成多次查找,我们需要有限制条件,
而这里的限制条件为:left<=right .即为当left处于right右边是,说明整个数组已经查找
过一遍了,没有所要查找的数字。
int binary_sort(int arr[], int len, int n)
{
//确定两个变量来指向数组两端
int left = 0;
int right = len - 1;
while (left <= right)
{
//确定中间值
int mid = (left + right) / 2;
//确定中间值与要查找的数的关系
if (arr[mid] > n)
{
right = mid - 1;//这里-1是因为mid指向的数据也是大于查找数据的
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;//循环完毕,说明没有找到数据
//为了防止二义性,我们返回一个不是数组下标的数
}
5.完整的程序
#include<stdio.h>
int binary_sort(int arr[], int len, int n)
{
//确定两个变量来指向数组两端
int left = 0;
int right = len - 1;
while (left <= right)
{
//确定中间值
int mid = (left + right) / 2;
//确定中间值与要查找的数的关系
if (arr[mid] > n)
{
right = mid - 1;//这里-1是因为mid指向的数据也是大于查找数据的
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;//循环完毕,说明没有找到数据
//为了防止二义性,我们返回一个不是数组下标的数
}
int main()
{
//建立有序数组,也可输入
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//求出数组的长度
int len = sizeof(arr) / sizeof(arr[0]);
//输入要查找的数
int n = 0;
scanf("%d", &n);
//函数调用和判断
int ret = binary_sort(arr, len, n);
if (ret >= 0)
{
printf("找到了:arr[%d] = %d\n",ret, n);
}
else
{
printf("没找到\n");
}
return 0;
}