第七周:数组运算---2-搜索
线性搜索:逐个依次
#include<stdio.h>
int search(int key,int a[],int len)
{
int ret=-1;
int i;
for(i=0; i<len; i++ )
{
if (key==a[i])
{
ret=i;
break;
}
}
return ret;
}
int main()
{
int a[]={1,3,2,5,12,14,23,6,9,45};
int r = search( 16 , a , sizeof(a)/sizeof(a[0]) );
printf("%d\n",r);
return 0;
}比较 1
#include<stdio.h>
int search(int key,int a[],int len)
{
int i;
for(i=0; i<len; i++ )
{
if (key==a[i])
{
return i;
break;
}
}
return -1;
}
// 违反了单一出口原则
int main()
{
int a[]={1,3,2,5,12,14,23,6,9,45};
int r = search( 16 , a , sizeof(a)/sizeof(a[0]) );
printf("%d\n",r);
return 0;
}比较 2
#include<stdio.h>
int search(int key,int a[],int len)
{
int i;
for(i=0; i<len; i++ )
{
if (key==a[i])
{
break;
}
}
if(i==len)
{
return -1;
}
else
{
return i;
}
}
// i 承担了多个责任,一专多能并不是好的代码
int main()
{
int a[]={1,3,2,5,12,14,23,6,9,45};
int r = search( 16 , a , sizeof(a)/sizeof(a[0]) );
printf("%d\n",r);
return 0;
}
#include<stdio.h>
int amount[] = {1,5,10,25,50};
char *name[] = {"penny","nickel","dime","quarter","half-dollar"};
int search(int key,int a[],int len)
{
int ret=-1;
int i;
for(i=0; i<len; i++ )
{
if (key==a[i])
{
ret=i;
break;
}
}
return ret;
}
int main()
{
int k=10;
int r = search( k , amount , sizeof(amount)/sizeof(amount[0]) );
if( r>-1)
{
printf("%s\n",name[r]);
}
return 0;
}#include<stdio.h>
int main(){
struct{
int amount;
char *name;
}coins[]={
{1,"penny"},
{5,"nickel"},
{10,"dime"},
{25,"quarter"},
{50,"half-dollar"}
};
int k=10;
int i;
for(i=0 ; i<sizeof(coins)/sizeof(coins[0]) ; i++)
{
if(k == coins[i].amount)
{
printf("%s\n",coins[i].name);
break;
}
}
return 0;
}#include<stdio.h>
int search(int key,int a[],int len)
{
int ret=-1;
int left = 0;
int right = len-1;
while ( right>left )
{
int mid = (left+right ) / 2;
if( a[mid] == k )
{
ret = mid;
break;
}else if (a[mid]>k )
{
right = mid-1;
}else {
left = mid+1;
}
}
return ret;
}