算法的查找
算法的查找,目前练习的是顺序查找,二分查找,分块查找以及哈希查找。
1,顺序查找的话,优点是算法简单,对表的结构没有要求,对数组兼容极高,如果给它评个级的话:★★★★★
当然它也有一个很大的缺点,得一个个从头查起,如果查询的数据少的话,还可以用用,数据多的话,那么它的效率是:★★。
#include <stdio.h>
int search(int a[],int y,int x); int main(void) { int i,x=0,n=0; int a[10]; printf("请输入是个数字! \n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } printf("请输入要查找的数字"); scanf("%d",&x); n=search(a,n,x); if(n>0) { printf("您查找的数 %d 在第%d 个位置上\n",x,n); } else { printf("没有您要找的数"); } return 0; } int search(int a[],int y,int x) { int i; for(i=0;i<10;i++) { if(a[i]==x) { y=i+1; break; } } return(y); }
2,二分查找
优点是:它查找数据的效率想必顺序更高效,可以减少数据的比较次数。查找的时间大大减少。效率:★★★
但是它也有个很明显的缺点就是:查找表中的数据元素必须是有序的。 使用条件:★★★。
int search(int a[],int min,int max); int main(void) { int i,min=0,n=0,max=9,x=0; int a[10]; printf("请输入是个数字! \n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } printf("请输入要查找的数字"); scanf("%d",&x); n=search(a,min,max,x); if(n>0) { printf("您查找的数 %d 在第%d 个位置上\n",x,n); } else { printf("没有您要找的数"); } return 0; } int search(int a[],int min,int max,int x) { int mid; while(min<=max) { mid=(min+max)/2; if(a[mid]=x) { return mid+1; } else if(a[mid]>x) { max=a[mid]; } else { min=a[mid]; } } return -1; }
3,分块查找,就是将数据数组分为一块块,然后找到要查找对应的方块中,大大缩减查找时间。效率:★★★★
但是分块查找虽然对块中的节点没有要求,但快与快之间必须“按快排序”,后面一个快的每个值都必须大于前面一个快中的最大值。复杂度:★★★
int search(int a[],int n); struct cover { int start; int end; int key; }cover[4]; int main(void) { int i,j=-1,k,n; int a[]={2,6,9,13,18,21,26,29,31,36,39,46,49,52,59,63,88,99}; printf("已有的数组是\n"); for(i=0;i<sizeof(a)/sizeof(a[0]);i++) { printf("%d ,",a[i]); } for(i=0;i<3;i++) { cover[i].start=j+1; j=j+1; cover[i].end=j+4; j=j+4; cover[i].key=a[j]; } printf("现在请输入你想查找的数字\n"); scanf("%d",&k); n=search(a,k); if(n>0) { printf("你查询的值在第 %d个位置",n); } else { printf("没有你要查询的值"); } return 0; } int search(int a[],int n) { int i,j; i=0; while(i<3&&n>cover[i].key) { i++; } if(i>=3) { return -1; } j=cover[i].start; while(j<=cover[i].end&&a[j]!=n) { j++; } if(j>cover[i].end) { return -1; } return j; }
4,哈希算法,看了下好像有点麻烦,明天继续发上来,先弄个其他博主的链接