二分查找
2018-02-24 09:45
176 查看
如何在一个无序的数列中查找到一个指定的数据,就涉及到查找的问题。最直观想到的方法无非就是从头到尾一个一个的比较,直到中间某个数据符合或是到最后一个元素查找失败。但这样做时间复杂度较大,很难满足程序的需求,故我们需要一些更加高效的算法,而二分查找就是一个使用很普遍的算法。
二分查找算法既可以设计成递归的方式,也可以设计成循环结构的算法。
建立在数组结构上的两种方式的二分查找如下:
二分查找的基本思想
在一个查找区间中,确定出查找区间的中心位置,用待查找数据元素的关键字和中心位置上数据元素的关键字比较,若两者相等,则查找成功;否则,若前者小于后者,则把查找区间定位原查找区间的前半段继续这样的过程;否则,,若前者大于后者,则把查找区间定位原查找区间的后半段继续这样的过程;这样的查找过程一直进行到查找区间的上界小于查找区间的下界为止。二分查找算法既可以设计成递归的方式,也可以设计成循环结构的算法。
建立在数组结构上的两种方式的二分查找如下:
//非递归方式实现二分查找 int binarySearch(int arr[],int key){ int mid; int start=0; int end = getArrayLen(arr)-1; while(start<end){ mid=(start+end)/2+start; if(arr[mid]==key) return mid; else if(key<arr[mid]){ end=mid-1; } else if(key>arr[mid]){ start=mid+1; } } return -1; }
//递归方式实现二分查找 int binarySearch_recursion(int arr[],int start,int end,int key){ int mid; while(start<end){ mid=(start+end)/2+start; if(arr[mid]==key) return mid; else if(key<arr[mid]){ end=mid-1; binarySearch_recursion(arr,start,end,key); } else if(key>arr[mid]){ start=mid+1; binarySearch_recursion(arr,start,end,key); } } return -1; }
相关文章推荐
- 二分查找模版
- 二分查找【转】
- 二分查找的扩展
- #1133 : 二分·二分查找之k小数(优先队列或SBT或排序)
- 码农小汪剑指Offer之35-数字在排序数组中出现的次数 暴力 二分查找的运用
- STL 二分查找
- HDU 2199 || HDU 2899 (二分查找+数学问题)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 快速排序、二分查找 学生信息(可进行姓名查找)
- C1001:二分查找
- 二分查找
- hdu 5101 Select【二分查找】
- 二分查找思想寻找有序数组中查找最小值
- Cup(二分查找)
- 二分查找
- Light OJ 1138 (二分查找+分解阶乘)
- 二分查找、三分查找求极点、二分求等比数列【模板】
- 二分查找
- 《算法导论》4、二分查找实现(C++)
- 二分查找的改进 差值查找(low<=high,这与快排low<high)