//l.date[0]未储存数据
#include<stdio.h>
#include<stdlib.h>
#define max_size 1000
#define ok 1
#define error 0
typedef struct sq{
int date[max_size];
int lenth;
}sqlist;
void insert(sqlist *l,int n) //线性表的初始化
{
int i;
int temp;
l->lenth = 0;
if(n>max_size)
{
printf("error no room");
exit(0);
}
for(i=1;i<=n;i++)
{
scanf("%d",&temp);
l->date[i] = temp;
l->lenth++;
}
}
int Sequential_Search(sqlist l,int e)
{
int i;
for(i=0;i<l.lenth;i++)
{
if(l.date[i]==e)
return i;
}
return 0;
}
int Sequential_Search1(sqlist l,int e) //查找元素,找到则返回元素下标
{
int i;
l.date[0]=e;
i=l.lenth;
while(l.date[i]!=e)
i--;
return i;
}
/*折半查找**/
int Sequential_Search2(sqlist l,int e)
{
int low,mid,high;
low=1;
high=l.lenth;
while(low<=high)
{
mid=(low+high)/2;
if(e<l.date[mid])
high=mid-1;
else if(e>l.date[mid])
low=mid+1;
else
return mid;
}
return 0;
}
//斐波那契查找
int Fibonacci_Search3(sqlist l,int e)
{
int low,high,i,k,mid;
int F[21];
i=3;
F[0]=0;
F[1]=1;
F[2]=1;
while(i<=20)
{
F[i]=F[i-1]+F[i-2];
i++;
}
low=1;
high=l.lenth;
k=0;
while(l.lenth>F[k]-1)
k++;
for(i=l.lenth+1;i<F[k]-1;i++)
{
l.date[i]=l.date[i-1];
l.lenth++;
}
while(low<=high)
{
mid =low+F[k-1]+1;
if(e<l.date[mid])
{
high=mid-1;
k=k-1;
}
else if(mid>l.date[mid])
{
low=mid+1;
k=k-2;
}
else
{
if(mid<l.lenth)
return mid;
else
return l.lenth;
}
}
return 0;
}
void print(sqlist l)
{
int i;
for(i=1;i<=l.lenth;i++)
printf("%d ",l.date[i]);
if(i==l.lenth)
printf("\n");
}
int main()
{
sqlist *l;
int n;
int m;
l=(sqlist*)malloc(sizeof(sqlist));
l->lenth=0; //初始化输入的数据个数,少于max_siax个
printf("请输入链表元素个数");
scanf("%d",&n);
printf("请输入链表元素(按照从小到大的顺序)\n");
insert(l,n);
printf("输入要查找的数(波菲那契查找)");
scanf("%d",&n);
m=Fibonacci_Search3(*l,n);
printf("元素%d在循序表的下标为%d",n,m);
printf("\n输入要查找的数(折半查找)");
scanf("%d",&n);
m=Sequential_Search2(*l,n);
printf("元素%d在循序表的下标为%d",n,m);
printf("\n输入要查找的数(哨兵查找)");
scanf("%d",&n);
m=Sequential_Search1(*l,n);
printf("元素%d在循序表的下标为%d",n,m);
printf("\n输入要查找的数(简单查找)");
scanf("%d",&n);
m=Sequential_Search(*l,n);
printf("元素%d在循序表的下标为%d",n,m);
return 0;
}
顺序表的查找优化
最新推荐文章于 2024-06-26 20:19:29 发布