C语言中的查找算法

本文介绍了顺序查找法的基本概念和实现,强调了其效率低下的问题,并进一步讲解了二分查找法,包括其前提条件、过程和一个简单的示例。作者还提到将二分查找部分封装为函数以提高复用性。
摘要由CSDN通过智能技术生成

一.顺序查找法

顺序查找是一种最简单的线性查找方法。其基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。

顺序查找是最基本的查找算法。

顺序查找的基本代码如下:

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;

	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;

	for (i = 0; i < sz; i++)//一个一个穷举
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是%d\n", i);
			break;
		}
	} 
	if (i == sz)
		printf("找不到此数字");
	return 0;
}

由此可见,顺序查找的效率十分低下,这只是10个数字,倘若有十万千万个,这个程序就会变得十分的繁琐。

所以我接下来要介绍另一种查找算法——二分算法

这张图就很好地表现了顺序查找和二分查找的区别,以及二分查找的简便性。

废话不多说,接下来就让我介绍二分查找吧。

二.二分查找法

二分查找,也称为折半查找。在使用二分查找时,我们需要一个升序的数组,否则就会出现错误。

就跟小朋友排队一样,如果不按身高顺序从矮到高的话,每次折半找小朋友的时候就会忽略一些没有按顺序站好的小朋友,也许要找的小朋友就在你折去的一半里面,这样就没办法找到你想要的小朋友了。

所以一定一定要注意我们查找中的数组一定要是一个升序的数组,若不是升序,我们可以先将数组排序,再进行查找。

有关排序的算法在这里不多作介绍,大家可以自行查阅资料,或者过段时间在我的主页查找也可以。

二分查找的过程如下:

1.确定被查找的范围

2.确定被查找范围的左右下标

3.根据左右元素的下标确定中间元素的下标

4.找到中间元素和要找的元素比较

a.找到,结束

b.未找到,重新回到第一步,找范围

 以下是一个简单的寻找7的过程介绍:

在这个地方(0+9)/2=4,下标为4时数组中的数为5,因为5<7,所以我们这时要将左下标换为4+1=5,再重新比较。这个地方有一个+1是因为不+1的情况我们已经比较过了,所以在此基础上+1。

即:

这个时候left=4,right=9,mid=(4+9)/2=6,这是下标为6的数恰好为7,将7与我们需要的数作比较,这样我们就找到了想要的数字。不用再继续向下运行了。

 

以上只是一个简单的情况,不过再往后也是上述过程的循环,所以,只要弄清楚了基本原理,二分查找还是很简单的。 

接下来是这个程序的代码实现:

#include<stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//已知的整形有序数组
    int a = 0;//x是要寻找的数
    int left = 0;//左下标
    int right = sizeof(arr) / sizeof(arr[0]) - 1;//数组右下标  
    
    scanf("%d", &a);

    while (left <= right)
    {
        int mid = left+(right-left)/2;//找到最中间的数

        if (a < arr[mid])
        {
            right = mid-1;
        }
        else if (a > arr[mid])
        {
            left = mid+1;
        }
        else
        {
            printf("找到了,下标是%d\n", mid);
            break;
        }
    }
    if (right < left)
    {
        printf("没找到");
    }
 
    return 0;
}
 

在这个里面,我将二分查找的部分写为了函数,也是为了方便多次运用二分查找。

所以有需要多次使用的部分大家可以将其写为函数方便自己的使用。

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值