1.线性查找:
1.1线性查找的思想:
线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。
1.2代码实现:
#include <stdio.h>
#define N 10
int Linear_lookup(int *arr, int n)
{
int i = 0;
int j = 0;
j = N;
while (j--)
{
if (arr[i] == n)
{
return i;
}
i++;
}
return -1;
}
int main()
{
int n = 0;
int arr[N] = { 1,2,3,4,5,6,7,8,9,10 };
printf("请输入需要查找的数据");
scanf("%d", &n);
int ret = Linear_lookup(arr,n);
if (ret == -1)
{
printf("没找到\n");
}
else
printf("该下标为:>%d", ret);
return 0;
}
1.3运行测试:
2.二分查找:
2.1二分查找的思想:
二分查找的基本思想是将n个元素分成大致相等的两部分,取a [n/2]与x做比较,如果x=a [n/2],则找到x,算法中止;如果x<a [n/2],则只要在数组a的左半部分继续搜索x,如果x>a [n/2],则只要在数组a的右半部搜索x.
2.2代码实现:
#include <stdio.h>
int Binary_lookup(int nums[], int size, int target) //nums是数组,size是数组的大小,target是需要查找的值
{
int left = 0;
int right = size - 1; // 定义了target在左闭右闭的区间内,[left, right]
while (left <= right) { //当left == right时,区间[left, right]仍然有效
int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
if (nums[middle] > target) {
right = middle - 1; //target在左区间,所以[left, middle - 1]
}
else if (nums[middle] < target) {
left = middle + 1; //target在右区间,所以[middle + 1, right]
}
else { //既不在左边,也不在右边,那就是找到答案了
return middle;
}
}
//没有找到目标值
return -1;
}
int main()
{
int n = 0;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = 0;
printf("请输入您需要查找的内容:>");
scanf("%d", &n);
sz = sizeof(arr) / sizeof(arr[0]);
int ret = Bubbling_sorting(arr, sz,n);
if (ret == -1)
{
printf("没找到\n");
}
else
{
printf("这个数据的下标为:>%d", ret);
}
return 0;
}
2.3运行测试:
3.二者的时间复杂度:
最佳情况复杂性 - 在线性搜索中,最佳情况发生在我们要查找的元素位于数组的第一个位置时。 线性搜索的最佳时间复杂度是 O (1)。 平均案例复杂度 - 线性搜索的平均案例时间复杂度为 O (n)。
假使总共有n个元素,那么二分后每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
最坏的情况是K次二分之后,每个区间的大小为1,找到想要的元素
令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn).
4.二者的差别:
线性查找:时间复杂度为O(n),但是不需要查找的数组为有序数组,无论是任何数组都可以使用,只是时间比较长
二分查找:时间复杂度为O(logn),一般所用时间比线性查找短,速度快,但是最大的问题就是只能对有序的数组进行查找,只要是无序的数组都无法进行二分查找