第七周:数组运算---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; }