当我们遇到这个练习题后,第一反应的做法应该是这样的
首先,我们创建一个数组,存放1到10在数组中
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
比如,我们在数组中寻找数字7;
则先定义一个数为7,即int k = 7;
并定义整数为0的i,好让在数组的下标增加时不漏掉数组中的每一个元素
即int i = 0;
然后我们定义一个整数sz为元素个数
即int sz = sizeof(arr) / sizeof(arr[0]);
后面,我们开始for循环
for (i = 0; i < sz; i++) 当i的值小与数组所有值的下标都执行以下循环
if (k == arr[i])
{
printf("找到了,下标是:%d", i);
break;
}
找不到时,用if语句,缺少没有判断真假的条件。
因此,我们想到在之前便定义一个整数int flag = 0;
在上边的if语句中加上flag = 1;
现在,我们有了找不到时的if语句的条件
if (flag == 0)
{
printf("找不到");
}
现在,在有序数列中寻找某数的代码便完成了
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//在数组中查找7
int i = 0;
int flag = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (k == arr[i])
{
printf("找到了,下标是:%d", i);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("找不到");
}
return 0;
}
但这个程序效率又很低,需要将这个数组的元素全部都找一遍,又这个题目的数列是有序的,因此,我们开始使用2分法;类似用法同求数学中的二分法一致。
但这个题为何要使用二分法呢,如果这个数列有2亿个元素,使用1次二分法便省去了找1亿个元素的程序执行,因此,二分法在某些时刻是必要的,下面,我们看看二分法的程序创作。
二分法主要计算中见间元素的左右下标,从而计算中间变量下标,在与要寻找的值进行比较
我们依然定义数组元素为1到10,并在数组中寻找7。
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//在数组中查找7
int i = 0;
int flag = 0;
int sz = sizeof(arr) / sizeof(arr[0]); sz便为元素的数量
但我们要求中间下标,则需要我们把第一个下标与最后一个下标相加在除以2
先定义第一个下标与最后一个下标
int left = 0;
int right = sz - 1; 为何减去1为最后一个下标呢,因为数组的下标是从0开始记的
接下来我们使用while语句,当什么时候程序全部被寻找结束而停止呢?自然是left<=right时,程序停止
这段过程为不断取数组元素的一半
int mid = (left + right) / 2;//int mid=left+(right-left)/2
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
flag = 1;
printf("找到了,下标是%d\n", mid);
break;
}
这个是循环最终找到了的if语句。
当最后上边程序结束后依然没1有找到我们所找的数,便执行以下程序:
if (flag == 0)
{
printf("找不到");
}
但我们要记得,二分法只能用在有序述列,若该序列不是有序的,则无法使用,因为该原理为与中间值比较大小,从而缩小寻找范围。注:若不是有序数列,则食用上面的程序。
则二分法的程序如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//在数组中查找7
int i = 0;
int flag = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)
{
int mid = (left + right) / 2;//int mid=left+(right-left)/2
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
flag = 1;
printf("找到了,下标是%d\n", mid);
break;
}
}
if (flag == 0)
{
printf("找不到");
}
return 0;
}
因为我们寻找的数为7,所以程序执行结果为:找到了,下标是6