任务介绍:在一个有序的数组中查找具体的某个数字 n 。
方法一:挨个查找
顾名思义,我们通过一个一个地查找数组的下标,直到找到我们要的数字
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//下标为:0,1,2,3,4,5,6,7,8,9
int num = 7;
//在数组中找到数字7
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//元素个数 = 数组的总元素字节长度 / 单个元素的字节长度
for (i = 0; i < sz; i++)
//一个一个地查找数组的下标
{
if (num == arr[i])
{
printf("找到了,下标为:%d\n", i);
printf("数字为:%d\n", arr[i]);
break;
}
}
if (i == sz)
//说明要查找的数字不在数组中
{
printf("找不到!\n");
}
return 0;
}
方法二:折半查找
折半查找法是效率较高的一种查找方法。在有序的数组中我们通过每次查找数组的中间下标,将我们要找到数字的范围缩小一半。
基本思想是:设我们要找的数字为 “num” ,定义左下标 “left” 为0,右下标 “right” 为元素的个数-1,中间下标 mid =(left+right)/ 2 取商,在循环语句中用中间下标所对应的值 “arr[mid]” 与“num” 比较,若“arr[mid]” 大于 “num” ,则将右下标替换为 “mid - 1”,到左半段继续查找 ,若“arr[mid]” 小于 “num” ,则将左下标替换为 “mid + 1” ,到右半段继续查找,以此类推。直到“arr[mid]” 等于 “num” ,则输出我们所要找的值,停止查找。
如果左下标 “left” 大于右下标 “right” ,说明没有该数字,程序结束。
#include <stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//下标为:0,1,2,3,4,5,6,7,8,9
int sz = sizeof(arr) / sizeof(arr[0]);
//元素个数 = 数组的总元素字节长度 / 单个元素的字节长度
int left = 0;//数组的左下标
int right = sz - 1;//数组的右下标
int num = 7;//要找的数字
while (left <= right)
{
int mid = (left + right) / 2;//中间下标
if (arr[mid] > num)
//“arr[mid]” 大于 “num” ,则将右下标替换为 “mid - 1”,到左半段继续查找
{
right = mid - 1;
}
else if (arr[mid] < num)
//“arr[mid]” 小于 “num” ,则将左下标替换为 “mid + 1”,到右半段继续查找
{
left = mid + 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
printf("数字为:%d\n", arr[mid]);
break;
}
}
if (left > right)//当左下标大于右下标时,说明没有我们要找的数字
{
printf("找不到!\n");
}
return 0;
}