简述
也叫折半查找,性能优异。
但是所查找的数列必须是有序序列。
复杂度
- 时间复杂度
- log2(N)
实现
非递归实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int BinarySearch(int array[],int key,int length) { int left = 0; int right = length - 1; int mid = 0; while(left <= right) { mid = (left+right)/2; if(array[mid] == key) return mid; else if(array[mid] > key) right = mid - 1; else left = mid + 1; } } |
递归实现
1 2 3 4 5 6 7 8 9 10 |
int BinarySearch(int array[],int left,int right,int key) { int mid = (left + right)/2; if(array[mid] == key) return mid; else if(array[mid] > key) BinarySearch(array,left,mid - 1,key); else BinarySearch(array,mid + 1,right,key); } |
插值查找
- 二分查找每次都会计算出一个mid,然后拿这个mid的值去做比较
$$
mid = \frac{(low+high)}{2}
$$
$$
mid = \frac{low+high}{2} = low + \frac{1}{2}(high - low)
$$
- 插值查找本质就是对上面这个算法进行优化,方案如下:
$$
mid = low + \frac{key - a[low]}{a[high] - a[low]}(high - low)
$$
-
示例,
a[11] = {0,1,16,24,35,47,59,62,73,88,99}
。- 查找16,key为16
- low为1,high为10,a[low]为1,a[high]为10
-
插值查找是根据要查找的关键字key与查找表中最小最大记录的关键字比较后的查找方法,其核心就在于上面这个公式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int InterpolationSearch(int array[],int key,int length) { int left = 0; int right = length - 1; int mid = 0; while(left <= right) { mid = left + (right - left)*(key - array[left])/(array[right] - array[left]); if(array[mid] == key) return mid; else if(array[mid] > key) right = mid - 1; else left = mid + 1; } } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 排序_基数排序09/04
- ♥ 匹配_朴素字符串匹配算法10/14
- ♥ 排序_计数排序05/08
- ♥ 数据结构模板03/09
- ♥ 匹配_有限自动机字符串匹配算法10/13
- ♥ 动态规划_最长公共子序列09/05