前言
在真正的项目中,查找是一个必不可少的功能。在一堆数据中,查找从头开始某一个元素,如果运气好,那么前几次就能查到想要的元素。而最怕的往往是运气不好的情况,查找到最后一个才查找,甚至是最后一个都不是我们要查找的元素,这个时候是非常浪费性能的。
查找的算法有许多种,如果在这组数据是在排序好的情况下,那么二分查找会是一种非常高效的查找算法,但也仅限于该组数据排序好(亦或是有规律)的情况下。
一、算法思想介绍
对于一组排好序(假设是从小到大)的数据,如果我们想要查找某一个元素是否在这组数据中(或是在这组数据中的什么位置),那么我们需要做的操作是:
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 -1;
// 获取中间元素
int middle