C语言数据结构顺序表的顺序查找和折半查找的功能

C语言顺序表顺序查找和折半查找的基本思想和应用

顺序查找算法:又称为线性查找,主要用在—线性表—中进行查找
通常分为:1—无序线性表的一般查找;
2—对关键字有序的顺序表查找;
优缺点分析:
缺点:当线性表的表长过于长时,平均查找长度较大,效率低。
优点:对顺序表中数据元素的存储没有要求,顺序存储链式存储均可。
需注意:对于线性表的链式存储只能使用顺序查找.
折半查找,又称二分查找,它仅适用于有序的顺序表
首先将给定值key与表中间位置元素的关键字比较,若相等,则查找成功,返回该元素的存储位置;(例如,在查找表升序排列时,若给定值key大于中间元素的关键字,则所查找的关键字只可能在后半部分)若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分中;然后在缩小范围内继续进行同样的查找,如此重复直到找到为止,若查找不成功,返回查找失败信息
优缺点分析:
折半查找方法的优点:折半查找的优点是比较次数少,查找速度快,平均性能好;
折半查找方法的缺点:折半查找的缺点是:要求待查表为有序表,且插入删除困难。
因此:折半查找方法适用于不经常变动而查找频繁的有序列表。

目的是:⑴ 输入一批整型数据,建立顺序表,然后用顺序查找;
⑵ 输入一批有序整型数据(如从小到大),然后用折半查找,查找一给定的整数。

#include <stdlib.h>
#define maxsize 20//全局定义

#define OK 1
#define OVERFLOW -2
typedef struct
{
	int key;//关键字
}ElemType;
typedef struct
{
	ElemType *elem;
	int length;
}sqlist;
int initList(sqlist &L)
{
	L.elem=new ElemType[maxsize];//分配数组存储空间
	if(!L.elem) exit (OVERFLOW);
	L.length=0;
	return OK;
}
void display(sqlist &L)//自定义输出函数,将顺序表的key值输出。
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d ",L.elem[i].key);
	printf("\n");
}
void get(sqlist &L,int size)//3.自定义取值函数利用循环依次为elem[i].key取值,
{
	for(int i=0;i<size;i++)
	{
		scanf("%d",&L.elem[i].key);
	    L.length++;
	}
}
int search(sqlist L,int key)//自定义顺序查找函数,在顺序表L中顺序查找其关键字等于key的数据元素,若找到,则函数值为该元素在表中的位置,否则为0.
{
	for(int i=L.length;i>=1;--i)
		if(L.elem[i].key==key)  return i;
		return 0;
}
int search_Bin(sqlist L,int key)//6.自定义折半查找函数,置查找区间初值,low为1,high为表长;当low小于等于high时,mid取low和high的中间值,将给定值key与中间位置记录的关键字进行比较,若查找成功返回mid,若不相等则利用中间位置记录将表对分成前后两个子表。如果key比中间位置记录的关键字小,则high取为mid-1,否则low取为mid+1;循环结束,说明查找区间为空,则查找失败,返回0.
{
	int low=1,high=L.length,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(key==L.elem[mid].key) return mid;
		else if(key<L.elem[mid].key)  high=mid-1;
		else  low=mid+1;
	}
	return 0;
}


int main()
{
	int m,x,y;
	int m1,x1,y1;
	sqlist L,M;
	initList(L);
	initList(M);
	printf("请输入顺序表的长度(顺序查找)\n");
	scanf("%d",&m);
	printf("请输入一批数据\n");
	get(L,m);
	printf("以下为输入的顺序表(顺序查找)\n");
	display(L);
	printf("请输入你想查找的元素(顺序查找)\n");
	scanf("%d",&x);
	y=search(L,x);
	printf("经过顺序查找发现查找的元素在第%d位\n",y+1);
	printf("请输入顺序表的长度(折半查找)\n");
	scanf("%d",&m1);
	printf("请按由大到小输入一批数据(折半查找)\n");
	get(M,m1);
	printf("以下为输入的顺序表(折半查找)\n");
	display(M);
	printf("请输入你想查找的元素(折半查找)\n");
	scanf("%d",&x1);
	y1=search_Bin(M,x1);
	printf("经过折半查找发现查找的元素在第%d位\n",y1+1);
	return 0;
	


}`

在这里插入图片描述

C语言数据结构第二版(严蔚敏、李冬梅)著

  • 24
    点赞
  • 243
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值