一、顺序查找
1.思路
将需要查找的数按顺序一个一个地与数组中元素进行比较,相等说明找到了,否则没找到
2. C语言代码实现
#include<stdio.h>
int main()
{
int a[10] = {
1,5,6,4,9,2,3,8,7,10 },i,k,find;
printf("请输入需要查找的数k:");
scanf("%d", &k);
find = 0;//用find的值来判断该数有没有找到
for (i = 0; i < 10; i++)
{
if (a[i] == k)
{
printf("找到了:%d,是a[%d],第%d个数", k, i, i + 1);
find = 1;
}
}
if (find == 0)
printf("没找到");
return 0;
}
- 运行结果:
二、二分查找(折半查找)
1. 思路
已知一个有序数组,将需要查找的数和数组的中间元素进行比较,若该数大于(小于)中间元素,则该数在中间元素的右边(左边),那么只需要将该数与右边(左边)的中间的数进行比较,创建循环,直至需要查找的数等于中间的数,即已经找到了该数,否则没有找到。
2. C语言代码实现:
#include<stdio.h>
int main()
{
int m, l, r,find,k;
int a[10] = {
1,2,3,4,5,6,7,8,9,10 };
printf("请输入需要找的数k:");
scanf("%d",&k);
l = 0; r =10- 1; find = 0;//l和r分别为最左边数下标和最右边数下标 用find的值来判断该数有没有找到
do
{
m = (l+r)/2;//中间值下标
if (k == a[m])
{
printf("找到了:%d,是a[%d],第%d个数", k,m,m+1);
find = 1;
break;
}
else if (k > a[m])
l = m + 1;//范围缩小至最中间值的右边
else if (k < a[m])
r = m - 1;//范围缩小至最中间值的左边
} while (l <= r);
if(find==0)
printf("没找到");
return 0;
}
-
运行结果:
-
需要多花点时间思考是跳出循环的条件:当范围不断缩小时,最左边数下标和最右边数下标可能会出现交叉,即最左边数下标大于最右边数下标,此时已经没有数可以查找了,就可以跳出循环了
3. C语言函数代码实现:
#include<stdio.h>
int main()
{
int arr[] = {
1,2,3,4,5,6,7,8,9,10 }, k=0;
printf("请输入需要找的数k:");
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
int binary_search(int b[], int k, int sz);//函数声明
int ret = binary_search(arr,k,sz);//调用函数并接收函数返回值
if (ret == -1)
printf("没找到");
else
printf("找到了:%d,是a[%d],第%d个数",k,ret, ret+1);
return 0;
}
int binary_search(int b[], int k, int sz)//函数定义
{
int l = 0;
int r = sz - 1;
while (l <= r)
{
int m = (l + r) / 2;
if (b[m] < k)
l = m + 1;
else if (b[m] > k)
r = m - 1;
else
return m;//找到了返回m
}
return -1;//没找到返回-1
}
- 运行结果:
- 使用函数的作用能在代码长的时候体现出来,使代码变得更简洁,容易阅读。需要注意的是,如果函数在主函数后面,在调用函数时要先声明函数
查找算法除了两种基本算法,即顺序查找和二分查找(折半查找)外,还有插值查找、斐波那契查找、树表查找、分块查找、哈希查找等