1. 顺序查找
从头到尾遍历一遍,耗时长、效率低。
main
函数中定义一个数组int a[10] = {12,34,45,23,54,2,4,65,23};
- 定义一个函数,查找指定数据
- 如果找到了,返回它的位置,数组下标即可,未找到返回
-1
main
函数中测试
#include <stdio.h>
typedef int DataType;
// p:保存数组首地址,n:元素总个数,value:要查找的值
// 数组长度,只能传入。数组名作为参数会退化成地址,不能计算内存大小
int findByOrder(int *p, int n, int value)
{
for (int i = 0; i < n; i++)
if (p[i] == value)
return i; //返回数组下标
return -1; //如果程序能执行到这肯定没找到
}
int main()
{
DataType arr[10] = {12, 34, 54, 23, 12, 3453, 564, 23, 121, 9};
DataType data; //要查询的数据值
int num = sizeof(arr) / sizeof(*arr); //元素总个数
puts("Please input need Find Data:");
scanf("%d", &data);
int ret = findByOrder(arr, num, data); //存储,结果的下标
if (ret == -1)
printf("Not find %d\n", data);
else
printf("Find %d at:%d \n", arr[ret], ret);
return 0;
}
顺序查找:当数据较多时int a[1000];
,查找慢。
2. 二分法查找
分半查找、拆半查找
每次都找中间的数。
前提条件:数组中元素必须为(递增/递减)有序序列。
思想:每次进行分半,判断在middle
的左边还是右边
#include <stdio.h>
// 二分查找
// value 代表的是被查找的值
// len 代表数组 长度(元素个数)
int findByHalf(int *p, int len, int value)
{
int low = 0; //low 低 //开头 位置 下标
int high = len - 1; //high高 //末尾 位置 下标
int middle; //用来保存 中间位置 的下标
// 从 [0,末尾下标] 都要遍历
// 注意此处循环结束的条件,需要加上 =
while (low <= high)
{
//不断获取中间位置的下标
middle = (low + high) / 2;
//如果在前半段,移动high
if (value < p[middle])
high = middle - 1;
//如果在后半段,移动low
else if (value > p[middle])
low = middle + 1;
//对应 正中间 情况
else if (value == p[middle])
return middle;
}
return -1; //代表没有找到
}
int main(int argc, const char *argv[])
{
int arr[] = {12, 34, 56, 77, 89, 342, 567, 7898};
int len = sizeof(arr) / sizeof(arr[0]); // 数组长度
for (int i = 0; i < len; i++) //把数组中的每个元素都找一遍,进行测试程序
printf("%d post is %d\n", arr[i], findByHalf(arr, len, arr[i]));
// 查找10000返回 -1
printf("\n%d post is %d\n", 10000, findByHalf(arr, len, 10000));
}