C语言顺序查找

思路

顺序查找:顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同 (即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。 该算法的时间复杂度为O (n),如果数据量很大时查找效率会很低。

折半查找:折半查找法 算法步骤描述. 编辑. ① 首先确定整个查找区间的中间位置 mid = (left + right)/2 。. ② 用待查关键字值与中间位置的关键字值进行比较;若相等,则查找成功;若大于,则在后(右)半个区域继续进行折半查找;若小于,则在前(左)半个区域继续进行折半查找。. ③ 对确定的缩小区域再按折半公式,重复上述步骤。. 最后,得到结果:要么查找成功, 要么查找失败。. 折半查找的存储结构采用一维数组存放 [3] 。.

代码(包含顺序查找,折半查找)

#include<stdio.h>
#define LIST_SIZE 50
#define KeyType int
typedef struct
{
	KeyType key;	//关键字域
}ElemType;

typedef struct
{
	ElemType data[LIST_SIZE];	//查找表存储空间
	int length;					//表长度
}SSTable;

void CreateSearch(SSTable *ST)
{
	int i;
	printf("请输入数据个数:");
	scanf("%d",&ST->length);
	printf("请按由小到大的顺序,输入%d个数据。\n",ST->length);
	for(i=1;i<=ST->length;i++)
	{
		printf("第%d个数据:",i);
		scanf("%d",&ST->data[i].key);
	}
}

void Output(SSTable *ST)
{
	int j;
	for(j=1;j<=ST->length;j++)
        printf("%d   ",ST->data[j]);
}

int Search_Seq(SSTable *ST,KeyType key)
{//在顺序表ST中查找关键字为key的数据元素,若找到返回该元素在数组中的下标,否则返回0
   int i;
   ST->data[0].key=key;
   for(i=ST->length;ST->data[i].key!=key;i--);
   return i;
}

int Binary_Search(SSTable *ST,KeyType key)
{//在顺序表ST中折半查找关键字为key的数据元素,若找到返回该元素在数组中的下标,否则,返回0
int l,h,m;
int flag;
l=1;
flag=0;
while(l<=ST->length){
    m=(l+h)/2;
    if(key<ST->data[m].key)
        h=m-1;
    else
    if(key>ST->data[m].key)
        l=m+1;
    else{
        flag=m;
        break;
    }
}
return flag;
}

void main(void)
{
	SSTable ST;     //调用SSTable 并命名为ST
	char ch='y';
	int n;
	int key;
	int result;
	while(ch=='y'||ch=='Y')
	{

	printf("\n\t\t         查找");
	printf("\n\t\t         1.创建查找表");
	printf("\n\t\t         2.显示查找表");
	printf("\n\t\t         3.顺序查找");
	printf("\n\t\t         4.折半查找");
	printf("\n\t\t         0.退    出");
	printf("\n\t\t请选择(0--3):");
	scanf("%d",&n);
	getchar();

	switch(n)
	{
	case 1:CreateSearch(&ST);break;   //创建表
	case 2:Output(&ST);break;         //输出表
	case 3:printf("请输入需要查找的关键字:");
			scanf("%d",&key);
			result=Search_Seq(&ST,key); //调用顺序查找函数
			if(result==0)
				printf("没有找到关键字为:%d的数据。\n",key);
			else
				printf("关键字为%d的数据,在查找表的位置:%d。",key,result);
			break;
	case 4:printf("请输入需要查找的关键字:");
			scanf("%d",&key);
			result=Binary_Search(&ST,key);     //调用折半查找
			if(result==0)
				printf("没有找到关键字为:%d的数据。\n",key);
			else
				printf("关键字为%d的数据,在查找表的位置:%d。",key,result);
			break;
	case 0:ch='n';break;
	default:printf("/n/t/t输出错误!请重新输入!");
	}
	printf("\n\n\n\n\n\n\n");

	}
}

运行展示:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值