数组查找
数组查找操作
查找数组中的值可通过比较数组的值与指定值来实现,此操作有以下几种实现方式:
线性或者序列查找
线性查找算法通过序列迭代的方式从数组中查找指定的值,直到找到或者迭代结束位置。
当数组元素列表为无序数组并且只执行一次查找时,使用线性查找是最好的方式。其时间复杂度依赖于数组的大小。
线性查找时间复杂度:
int main(){
int array[100],search,c,n;
printf("输入输入的长度");
scanf("%d",&n);
printf("输入的数值为 %d",n);
//为数组元素赋值
for (c=0;c<n;c++){
scanf("%d",&array[c]);
}
printf("输入要在数组中查找的值");
scanf("%d",&search);
for(c=0;c<n;c++){
if (array[c]==search){
printf("%d 查找的值位于索引 %d\n",serach,c+1);
break;
}
}
if (c==n){
printf("%d 数组中不存在要查找的值",search);
}
return 0;
}
时间复杂度
- 平均:O(n)
- 最好:O(1)
- 最差:O(n)
平均时间复杂度为O(n)时,可能查找的元素位于元素表末尾或者数组中不存在,线性查找需要遍历每个元素值,直到找到为止。查找算法的时间复杂度最佳和最坏情况分别为O(1)和O(n),因为在第一次迭代或者在最后一次迭代时才能找到要搜索的元素。
二分查找
线性查找有一个较大的缺点,在较大的数组中查找元素时,将导致时间复杂度上升,随着数组的增长,时间复杂度呈线性增长。在某些情况下,可以使用二分查找解决这个问题。
二分查找类似于我们查找书中一个特定的页码。我们在中间随机打开书的一页,把搜索范围缩小到书的左边或者右边,当页码有序的情况下,这个操作最终能找到目标页码。
二分查找时间复杂度:O(log n)
int main(){
int c,first,last,middle,n,search,array[100];
printf("输入数组元素的数量");
scanf("%d",&n);
printf("输入数量为%d的有序数组",n);
for (c=0;c<n;c++{
scanf("%d",&array[c]);
})
printf("输入要查找的值");
scanf("%d",&search);
first=0;
last=n-1;
middle=(first+last)/2;
while(first<+last){
if (array[middle]<search>){
first=middle+1;
}else if (array[middle]==search){
printf("查找的元素 %d 索引位置为 %d \n",search,middle+1);
}else{
last=middle-1;
}
middle=(first+last)/2;
}
if (first>last)
pintf("未能在数组中查找到目标元素: %d",serach);
return 0;
}
更多内容,欢迎关注: