//线性搜索
#include<stdio.h>
void main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int key;
int v;
printf("Insert the number you want to find in the list::n");
scanf("%d",&v);
for(int i=0;i<=10;i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
if(key>=0){
printf("Number found at possition %dnnn",key);
}
else{
printf("Sorry Not found in the listnnn");
}
printf("A programme by Soumya Darshan Rauth");
}
您的程序以线性时间运行,适用于较小的数组。对于任意输入,您的程序是最优的。尽管我不认为每次找不到所需值时都需要设置key=-1。
key = -1;
for(int i=0;i<=10;i++)
{
if(a[i]==v){
key=i;
break;
}
}
即使这样也会很好。
线性搜索具有线性时间复杂度O(n),但对于像您这样的固定大小的数组,可以说它具有恒定的时间复杂度奥(1)。
正如大家所说,它是O(n),但排序数组可以在O(log2(n))中搜索,因此在算法上它不是可以做的最好的
此外,在C上,它是脆弱的。它对10个数字不起作用,对11以外的任何其他数字都会失败。
通常,我们要么有一个名称,它是数组中元素的实际数量(我将使用旧式C,它可以处理任何事情:
void main()
{
#define MAX_A (10)
int a[MAX_A]={1,2,3,4,5,6,7,8,9,10};
// deleted some stuff
for(int i=0; i<MAX_A; i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
或者我们用这个稍微奇怪的sizeof
计算来计算阵列的正确大小
void main()
{
int a[MAX_A]={1,2,3,4,5,6,7,8,9,10};
// deleted some stuff
for(int i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
if(a[i]==v){
key=i;
break;
}else{
key=-1;
}
}
其总是阵列的大小。
你可以写一个更直接的循环,例如
for (key=0; a[key]!= v && key<sizeof(a)/sizeof(a[0]); key++)
然后,匹配测试更改为key < sizeof(a)/sizeof(a[0])
每次在数组中找不到值时,都会操作变量'key'。
你可以做的一个改进是将关键变量初始化为-1,并从循环中删除"else"代码块。
线性搜索的复杂性总是O(n)。
通常,main方法应该始终有一个整数作为返回类型(0表示成功,其他一切都表示发生了错误)。此外,main方法接受两个参数,即参数数量和作为char数组的参数(int argc,char*argv[])。如果不需要参数,最好在括号(int main(void))之间写"void"。for循环中的break语句通常被认为是不好的做法,因为循环何时/是否结束并不明显。在您的情况下,while循环将提高可读性。while循环看起来像这样:
while (i < 10 && a[i] != v) {
i++;
}
if (i >= 10) { ... } // not found
else { ... } // found at position i