算法设计与分析——二分查找

前言

在真正的项目中,查找是一个必不可少的功能。在一堆数据中,查找从头开始某一个元素,如果运气好,那么前几次就能查到想要的元素。而最怕的往往是运气不好的情况,查找到最后一个才查找,甚至是最后一个都不是我们要查找的元素,这个时候是非常浪费性能的。
查找的算法有许多种,如果在这组数据是在排序好的情况下,那么二分查找会是一种非常高效的查找算法,但也仅限于该组数据排序好(亦或是有规律)的情况下。

一、算法思想介绍

对于一组排好序(假设是从小到大)的数据,如果我们想要查找某一个元素是否在这组数据中(或是在这组数据中的什么位置),那么我们需要做的操作是:
1.首先将该组数据从中间划分为等长的两组(即便原数组不是偶数页没关系,取前面一半为一组,后面剩下的为一组即可)。
2.与正中间的元素(一般是数组的长度除2并且向下取整)进行比较,如果想要查找的数据当前被比较数据小,那么我们对左边的数组进行如上重复操作;如果想要查找的数据当前被比较数据大,同理,则对右侧的数组再次做第一步的操作;
3.重复如上操作,直至想要查找的数据当前被比较数据相同,这个时候算法结束。
二分排序思想

二、算法效率分析

  • 最好的情况下,前几次(假设为有限次数)便可以查到,那么算法效率就是常量级别,大O表示法:O(1)。
  • 最坏情况下,则是最后一次才找到(亦或最后一次都没有,这里要分情况而论),存在递推式:O(n)=1+O(n/2),O(1)=1。则最后的算法效率级别是O(logn),显然,这是一种效率非常快的查找算法,但最大的限制在于,需要原数组为排序好的情况下。
    二分查找算法效率分析

三、算法代码

3.1 C语言

我并没有利用C++里面的函数,全是C的用法,关于注释方面,我自认为我的注释足够完善了,大家观看代码时应该会很清晰。

/* 二分查找算法 */
/*
输入:
数组长度 
一组数据
想要查找的数据
输出:
想要查找数据在数组内的下标(如无则为-1) 
*/ 
#include<stdio.h>
#define MAXN 100000
// 递归二分
int divide(int *arr,int start,int end,int target){
   
	// 如果首比尾大 返回-1
	if(start>end) return 
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值