天天看点

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

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

本文先用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)

折半查找算法的流程图:

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