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

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

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

#include
#include
#include
#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;ireturn 0;//没有查找到
}
//打印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:
静态表查找--顺序表的查找(有序)--折半查找_第1张图片


(3)程序的运行结果:

静态表查找--顺序表的查找(有序)--折半查找_第2张图片

(4)

折半查找算法的流程图:

静态表查找--顺序表的查找(有序)--折半查找_第3张图片


你可能感兴趣的:(数据结构与算法)