C语言顺序查找和二分法查找(折半查找法)

本文介绍了两种基本的查找算法——顺序查找与二分查找,包括它们的工作原理、适用场景及代码实现。通过实例演示了如何使用这两种算法来查找数组中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.顺序查找

顾名思义,就是按顺序往下一个一个查找,找到时返回,最差的情况是未找到并且全部遍历了一遍,这是消耗时间最长的一个方法

1.1代码实例:顺序查找

//顺序查找 
int SeqSearch(RecType R[],KeyType x,int n){
	printf("开始顺序查找元素=>%d\n",x); 
	for(int i=0;i<n;i++){
		if(R[i].data==x){
			printf("找到元素%d了,在第%d个\n",x,i+1);
			return i+1;
		}
	}
	printf("找不到该元素%d\n",x);
	return -1;
}

2.二分法查找(折半查找法)

顾名思义,折半查找就是找一个元素,没找到就"切"一半继续找,直接舍弃另一边的元素

个人认为此方法需要建立在元素值已经排序后才可以进行查找元素位置

话不多说先上图
在这里插入图片描述
假设我们需要找到元素70的位置

  1. 先确定1位和末尾(图中为11位)的位置,值赋给low和high代表左驱和右驱,中间位置(图中为6)赋值给mid
    这时肯定有同学会问(就是我自己了),如果中间位置有俩怎么办呢,其实这个mid值的数据类型的int型的,也就是说假设(3+6)/2=4.5时,int类型的mid会得到4,也就是整型数据不看小数点(不是四舍五入,是不看小数点)
  2. 接下来比对mid位置的值是否等于要查找的值(图中为70),此时可以看到,56<70,所以需要在值更大的区间去寻找(这也是为什么我说二分法需要排序的原因),即进行 low=mid , mid=(left+right)/2
  3. 继续比对,现在mid=80了,80>70,即需要在更小区间,即进行 right=mid,mid=(left+right)/2 操作
  4. 重复操作,直到left==right为止结束

2.1代码实例:二分法查找元素

//二分查找 
int HalfSearch(RecType R[],KeyType x,int n){
	printf("开始二分查找元素=>%d\n",x);
	int left=0,right=n-1,mid=(left+right)/2;
	while(left!=right){
		if(R[mid].data==x){
			printf("找到%d元素的位置为%d\n",x,mid+1);
			return mid;
		}
		if(R[mid].data>x){
			right=mid;
			mid=(left+right)/2;
		}else if(R[mid].data<x){
			left=mid;
			mid=(left+right)/2;
		}
	}
	printf("找不到该元素%d\n",x);
	return -1;
} 

3.完整代码及结果示例

#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int InfoType;
typedef struct{
	KeyType key;
	InfoType data;
}RecType;

//创建 
void CreatList(RecType R[],KeyType keys[],int n){
	for(int i=0;i<n;i++){
		R[i].data=keys[i]+12;
		R[i].key=i+1;
	}
	printf("创建成功\n");
}

//顺序查找 
int SeqSearch(RecType R[],KeyType x,int n){
	printf("开始顺序查找元素=>%d\n",x); 
	for(int i=0;i<n;i++){
		if(R[i].data==x){
			printf("找到元素%d了,在第%d个\n",x,i+1);
			return i+1;
		}
	}
	printf("找不到该元素%d\n",x);
	return -1;
}

//二分查找 
int HalfSearch(RecType R[],KeyType x,int n){
	printf("开始二分查找元素=>%d\n",x);
	int left=0,right=n-1,mid=(left+right)/2;
	while(left!=right){
		if(R[mid].data==x){
			printf("找到%d元素的位置为%d\n",x,mid+1);
			return mid;
		}
		if(R[mid].data>x){
			right=mid;
			mid=(left+right)/2;
		}else if(R[mid].data<x){
			left=mid;
			mid=(left+right)/2;
		}
	}
	printf("找不到该元素%d\n",x);
	return -1;
} 

//输出
void DispList(RecType R[],int n){
	for(int i=0;i<n;i++){
		printf("关键字:%d  所对应的元素值为%d\n",R[i].key,R[i].data);
	}
} 


int main(){
	int keys[10]={1,2,3,4,5,6,7,8,9,10};
	RecType R[20];
	CreatList(R,keys,10);
	DispList(R,10);
	int local=SeqSearch(R,4,10);
	local=SeqSearch(R,14,10); 
	local=HalfSearch(R,18,10);
	local=HalfSearch(R,8,10);
}


结果

创建成功
关键字:1 所对应的元素值为13
关键字:2 所对应的元素值为14
关键字:3 所对应的元素值为15
关键字:4 所对应的元素值为16
关键字:5 所对应的元素值为17
关键字:6 所对应的元素值为18
关键字:7 所对应的元素值为19
关键字:8 所对应的元素值为20
关键字:9 所对应的元素值为21
关键字:10 所对应的元素值为22
开始顺序查找元素=>4
找不到该元素4
开始顺序查找元素=>14
找到元素14了,在第2个
开始二分查找元素=>18
找到18元素的位置为6
开始二分查找元素=>8
找不到该元素8

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值