您的位置:首页 > 其它

静态表查找--顺序表的查找(有序)--折半查找

2015-12-09 16:04 253 查看
静态查找表在查找的过程中不改变表的状态---不插入也不删除,适合不变动或者不经常变动的查找,顺序表可以使有序的也可以是无序的,如果是有序的可以使用折半查找,每查找一次,就把范围缩小一半,如果是无序的就只能从表的一端开始逐一查找了。

本文先用Create_Seq(SSTable &ST,ElemType r[],int n)构造一个无序的静态查找表,然后调用函数void Ascend(SSTable &ST)重建静态查找表为按照关键字为非降序排列,然后就可以进行折半查找指定的元素。

#include<stdio.h>
#include<malloc.h>
#include<process.h>
#define ERROR 0

//数据元素的类型
struct ElemType
{
int key;
};
//静态查找表的顺序存储结构
struct SSTable
{
ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)
int length;//表的长度
};
//对于两个数值型变量的比较约定为如下的宏定义
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))

//由n个数据元素的数组r,构造静态查找表ST
void Create_Seq(SSTable &ST,ElemType r[],int n)
{
int i;
//ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));//动态生成n+1个数据元素空间,0号单元不用
ST.elem=(ElemType*)malloc((n+1)*sizeof(ElemType));
if(!ST.elem)
exit(ERROR);
for(i=1;i<=n;i++)
ST.elem[i]=r[i-1];//将数组的元素依次赋值给ST
ST.length = n;
}
//重建静态查找表为按照关键字为非降序排列
void Ascend(SSTable &ST)
{
int i,j,k;
for(i=1;i<ST.length;i++)
{
k=i;
ST.elem[0]=ST.elem[i];//待比较的元素存入0号单元
for(j=i+1;j<=ST.length;j++)
{
if(LT(ST.elem[j].key,ST.elem[0].key))
{
k=j;
ST.elem[0]=ST.elem[j];
}
}
if(k != i)//有更小的值则交换
{
ST.elem[k]=ST.elem[i];
ST.elem[i]=ST.elem[0];
}
}
}
//在有序表ST中,折半查找关键字等于key的数据元素,返回在表中的位置(查找有序的顺序表)
int Search_Bin(SSTable &ST,long key)
{
int low,mid,high;
low=1;
high=ST.length;//置区间初值
while(low <= high)
{
mid=(low+high)/2;
if(EQ(ST.elem[mid].key,key))
return mid;
else if(LT(key,ST.elem[mid].key))
high=mid-1;//继续在前半个区间查找
else
low=mid+1;//继续在后半个区间查找
}
<span style="color:#ff0000;">return 0;//没有查找到</span>
}
//打印ST中的元素
void Traverse(SSTable ST)
{
ElemType *p;
int i;
p=++ST.elem;
for(i=1;i<=ST.length;i++,p++)
printf("%d ",p->key);
printf("\n");
}
//顺序表的有序查找
void main()
{
SSTable st;
int i;
int s;
ElemType r[5]={51,60,55,36,52};//数据元素
Create_Seq(st,r,5);//建立无序的顺序查找表
Ascend(st);//将无序的查找表重建为按照关键字非降序排列的查找表
Traverse(st);
printf("请输入你要查找值得关键字:");
scanf("%d",&s);
i=Search_Bin(st,s);
if(i)
printf("%d 是第%d个记录的关键字\n",st.elem[i].key,i);
else
printf("没找到!");
}
(1)静态查找表的顺序存储结构

struct SSTable

{

ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)

int length;//表的长度

};



(2)由n个数据元素的数组r,构造静态查找表ST:



(3)程序的运行结果:



(4)

折半查找算法的流程图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: