顺序表的查找
就是一个个去比对查找
#include<stdio.h>
#define maxsize 5
int sequentialsearch(int *a,int key)//要查找的数组,要查找的值,返回查找值对应对的数组下标
{
int i;
for(i=0;i<maxsize;i++)
{
if(a[i]==key)
return i;
}
return -1;
}
void main()
{
int n;
int a[maxsize]={0,2,1,5,4};
n=sequentialsearch(a,1);
if(n!=(-1))
printf("找到了!%d\n",n);
else if(n==-1)
printf("没找到!\n");
}
顺序表查找的优化
修改数组的存储方式,头设置为哨兵,减少了比大小的问题,效率更高
#include<stdio.h>
#define maxsize 6
int sequentialsearch(int *a,int key)//要查找的数组,要查找的值,返回查找值对应对的数组下标
{
int i;
a[0]=key;//数组的头设置为哨兵
i=maxsize-1;//从数组尾开始
while(a[i]!=key)
{
i--;
}
return i;//i=0则说明查找失败,否则返回查找的数组对应下标
}
void main()
{
int n;
int a[maxsize]={0,11,2,1,5,4};
n=sequentialsearch(a,13);
if(n)
printf("找到了!%d\n",n);
else if(!n)
printf("没找到!\n");
}
有表的查找--二分法查找
1、首先必须是有序表,例如a[5]={0,8,45,65,98};
2、中间值min的取值不用太计较,123456,中间值是3还是4都是一样的,不影响程序的编写。
3、比中值大,说明在中值的右边,那么移动h到min+1,同理比中值小,说明在中值的左边,那么移动r到min-1。
二分程序代码
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
int a[maxsize]={1,2,3,5,9,40,45,52,56,78};
int chazhao(int n)
{
int h,r,min;//头 尾 中
h=0;
r=maxsize-1;
while(h<=r)//当h>r时说明已经遍历完了
{
min=(h+r)/2;//中位置的确定,左一点右一点没有关系,比如123456,min等于3or4没关系,大概对半分开
if(a[min]>n)//要查找的值在左半段,将尾更新
r=min-1;
else if(a[min]<n)//要查找的值在右半段,将头更新
h=min+1;
else if(a[min]=n)
return min;
}
return -1;//返回查找失败
}
void main()
{
int i;
i=chazhao(100);
if(i==-1)
printf("查找失败!\n");
else
printf("数组的位置为下标%d\n",i);
}