二分查找
介绍
二分查找,又称折半查找,二分搜索,是一种在有序数组中查找某一特定元素的算法。优点是比较次数少,查找速度快,平均性能好;缺点是要求待查数组有序,且插入删除困难。因此二分查找适合于那些不经常变动而查找频繁的的有序列表。
假设数组中元素是有序的,搜索过程首先从数组的中间开始,如果中间元素刚好是要查找的元素,则搜索过程结束;否则利用中间位置记录的元素将数组分成前后两个字数组,如果某一特定元素大于或者小于中间元素,则在数组中大于或者小于中间元素的那一半查找,也从数组中间元素开始比较,重复以上步骤。
虽然第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现.
复杂度分析
因为二分搜索算法每一步都使搜索范围缩小一半,所以很明显时间复杂度是O(logn)
代码
二分查找在算法大家庭中属于"分治法",分治法基本都可以使用递归来实现。
递归实现如下:
public static int Binary_Search_R(int[] srcArray,int low,int high, int target) { if (low > high) return -1; int mid = (low + high) / 2; if (target = srcArray[mid]) return mid; if (target < srcArray[mid]) return Binary_Search_R(srcArray, low - 1, high, target); if (target > srcArray[mid]) return Binary_Search_R(srcArray, low + 1, high, target); }
非递归实现:
/// <summary> /// 二分查找算法 /// </summary> /// <param name="srcArray">有序数组</param> /// <param name="dest">要查找的元素</param> /// <returns>dest的数组下标,没找到返回-1</returns> public static int BinarySearch(int[] srcArray,int dest) { int low = 1; int high = srcArray.Length - 1; while (low <= high) { int middle = (low + high) / 2; if (dest == srcArray[middle]) { return middle; } else if (dest < srcArray[middle]) { high = middle - 1; } else { low = middle + 1; } } return -1; }
作者:樊勇
出处:http://www.cnblogs.com/fanyong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
我的联系方式:fanyong@gmail.com
个人独立博客:www.fy98.com