算法的查找,目前练习的是顺序查找,二分查找,分块查找以及哈希查找。
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,哈希算法,看了下好像有点麻烦,明天继续发上来,先弄个其他博主的链接