目录
二分查找算法定义
二分查找算法的过程剖析
二分查找算法的时间复杂度
二分查找的平均查找长度
二分查找的普通算法
二分查找的函数递归算法
Hello!大家好,我是努力赚钱买生发水的灰小猿,最近在做开发的时候偶然用到了之前数据结构上的二分查找算法,所以在这里和大家简单的分享一下适用于各种语言的二分查找算法编写。
那么什么叫二分查找算法呢?
二分查找算法定义
所谓二分查找算法,又叫折半查找,一般来说适用于数组元素,具体来说应该是已经按照顺序存储结构排列好的数组元素。它是一种效率较高的查找算法,通过对顺序表进行折半查找,从而获取到元素序列或查找次数的算法。
二分查找算法的过程剖析
我们假设现有的线性表中的元素是按照升序排列的,二分查找算法的思路就是将正在查找的表的中间元素和要查找的元素进行大小比较,若大小相等则输出该元素所在位置或查找次数;
若该中间元素不等于被查找元素时,会将该线性表以中间元素分成前后两部分的线性表,当中间元素小于被查找元素时,重新对后一部分的线性表进行二分查询;
反之,若中间元素大于被查找元素时,对前一部分的线性表进行相同的二分查找,当中间元素等于被查找元素时,查找结束;或直到线性表无法再进行分割时,查找结束,这个时候则说明表中无该元素。
下面是二分查找算法的查找图示:
二分查找算法的时间复杂度
二分查找的基本思想是:设有一个长度为n个元素的升序排列的数组a,分成前后大致相等的两部分,取中间元素a[n/2]与被查找元素(m)做比较,如果m=a[n/2],则找到m,算法中止;
如果m<a[n/2],则只要在数组a的左半部分继续二分查找m,如果m>a[n/2],则在数组a的右半部继续二分查找m.直到m=a[n/2]或数组不可再分割时查找结束。
因此时间复杂度就是while循环的次数,
总共有n个元素,
依次循环下去以后每次查找的元素个数就是:n、n/2、n/4、....n/2^k
若查找个数为n时,也就是第一次查找就找到了元素,则循环次数为1(也就是k=0的时候)所以循环次数为(k+1)
由于n/2^k取整后为(n/2^k)>=1
即令(n/2^k)=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O(h)=O(log2n)。
二分查找的平均查找长度
设待查找的元素为n,则折半查找的平均查找长度为:
二分查找的普通算法
以下为进行二分查找的函数方法,
传入的参数为升序排列的数组和要查找的元素,若查找到该元素,则返回查找次数,否则返回-1。
int binary_search(int[] a, int value)
{
int low = 0;
int high = a.length - 1;
while (low <= high)
{
int middle = (low + high) / 2;
if (a[middle] == value)
{
return middle;
}
if (value < a[middle])
{
high = middle - 1;
}
else
{
low = middle + 1;
}
}
return -1;
}
二分查找的函数递归算法
传入的参数分别为:递增的数组、要查找的数值、起始查找位置(默认为0)、终止查找位置(默认为数组长度)
int binary_search_ecursion(int a[],int value,int low,int high) {
int middle=0;
if(low<=high)
{
middle = (low+high)/2;
if (a[middle]==value) {
return middle;
}else {
if (a[middle]<value) {
return binary_search_ecursion(a, value, middle+1, high);
}
else {
return binary_search_ecursion(a, value, low, middle-1);
}
}
}
return -1;
}
二分查找的思维方法适用于任何需要进行顺序表查找的语言,并且基本思路都是一样的。上面的二分查找函数是基于C#的,小伙伴们还可以进行延伸。
觉得有用记得点赞关注哟!
大灰狼期待与你一同进步!