算法的查找

算法的查找,目前练习的是顺序查找,二分查找,分块查找以及哈希查找。

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("请输入是个数字! "); 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 个位置上 ",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("请输入是个数字! 
");
	 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 个位置上
",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("已有的数组是
");
	  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("现在请输入你想查找的数字
");
	  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,哈希算法,看了下好像有点麻烦,明天继续发上来,先弄个其他博主的链接

哈希查找

原文地址:https://www.cnblogs.com/HuSay/p/4908020.html