折半查找(二分搜索)的应用和技巧全面总结
折半查找应该算是算法中比较简单常见,但却很实用的方法之一了,又叫做二分搜索,其应用比较广泛,可以用于排序数组中元素的查找,复杂度仅为log(N),也可以用于有序数组中插入元素等等,一般而言针对排序数组的一些算法都会活多或少的用到折半查找活折半查找的思想,折半查找的实现主要分为两种方式,一种是遍历非递归形式,一种是采用递归的形式。
1、非递归形式,这种实现主要是通过每次调整中点的位置来实现。
int binsearch1(int arr[], int k, int l, int h){ if(l > h){ return -1; } int mid; while(l < h){ mid = (l + h) / 2; if(k == arr[mid]){ return mid; }else if(k > arr[mid]){ l = mid + 1; }else{ h = mid - 1; } } return mid;}五、二分思想的变形,其实二分是一种思想,不单单是应用于有序序列,可以应用于很多将序列进行划分的问题上,例如:
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数;
这道题看上去和二分完全没有关系,但是却可以利用二分的思想去解决,就是通过位将所有的元素分为两个集合,每次选取元素个数小的集合再按位分为两部分,最后找到不在文件中的32位数元素。
参考:二分查找之谜题
《编程珠玑》