问题
写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。
解析
本题使用顺序查找和二分查找进行检索
设计
//顺序查找核心代码
int j;
for (j = 0; j < n; j++) {
if (x == T[j])
{
printf("%d", j);
break;
}
}
if (j == n)
printf("j=0");
//二分查找核心代码
int BinarySearch(int a[], int n, int key) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid;
}
return -1;
}
分析
顺序查找时间复杂度O(n)
二分查找时间复杂度log2(n)
完整代码
//顺序查找
#include<stdio.h>
int main() {
int n, x;//n表示数组中数的个数,x表示要查找的数字
int T[1000];
printf("请输入数组中元素个数");
scanf_s("%d", &n);
printf("请输入数组");
for (int i = 0; i < n; i++)
scanf_s("%d", &T[i]);
printf("请输入需要查询的数字");
scanf_s("%d", &x);
int j;
for (j = 0; j < n; j++) {
if (x == T[j])
{
printf("%d", j);
break;
}
}
if (j == n)
printf("j=0");
return 0;
}
//二分查找
#include<stdio.h>
int BinarySearch(int a[], int n, int key) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid;
}
return -1;
}
int main() {
int n, x;//n表示数组中数的个数,x表示要查找的数字
int T[1000];
printf("请输入数组中元素个数");
scanf_s("%d", &n);
printf("请输入数组");
for (int i = 0; i < n; i++)
scanf_s("%d", &T[i]);
printf("请输入需要查询的数字");
scanf_s("%d", &x);
BinarySearch(T, n, x);
if (BinarySearch(T, n, x) == -1)
printf("j=0");
else
printf("%d", BinarySearch(T, n, x));
return 0;
}
本文深入讲解了两种基本的检索算法——顺序查找与二分查找,分别适用于未排序和已排序的数组。通过对比分析,详细解释了它们的时间复杂度,即顺序查找为O(n),而二分查找为O(log2(n)),并提供了完整的C语言实现代码。

549

被折叠的 条评论
为什么被折叠?



