折半,二分查找问题
2015-01-05 22:05
363 查看
问题:循环有序数组查找问题
一个循环有序数组(如:3,4,5,6,7,8,9,0,1,2),不知道其最小值的位置,要查找任一数值的位置。要求算法时间复杂度为log2(n)。问题分析:
我们可以把循环有序数组分为左右两部分(以mid = (low+high)/ 2为界),由循环有序数组的特点知,左右两部分必有一部分是有序的,我们可以找出有序的这部分,然后看所查找元素是否在有序部分,若在,则直接对有序部分二分查找,若不在,对无序部分递归调用查找函数。
代码如下:
#include <iostream> using namespace std; int binsearch(int A[],int left,int right,int val){ if (A == NULL||left>right) return -1; while (left <= right){ int mid = left + (right - left) / 2; if (A[mid] > val) right = mid - 1; else if (A[mid] < val) left = mid + 1; else return mid; } return -1; } int seach_c(int A[],int left,int right,int val){ if (A==NULL||left>right) { return -1; } int mid = left + (right - left) / 2; //if find return the pos if (A[mid] == val) return mid; if (A[mid] > A[left]){ //left is by order if (A[mid] > val && A[left]<= val){ return binsearch(A, left, mid-1, val); } else{ return seach_c(A, mid+1, right, val); } } else{ //right is by order if (A[mid] < val && A[right]>=val ){ return binsearch(A, mid+1, right, val); } else{ return seach_c(A, left, mid-1, val); } } } int main() { int a[] = { 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 }; cout << seach_c(a, 0, 9, 0) << endl; return; }
相关文章推荐
- 折半,二分查找问题
- 折半(二分)查找
- HDU 2199 || HDU 2899 (二分查找+数学问题)
- 二分(折半)查找的详细解说
- 二分查找解决数组元素定位问题
- 旋转数组二分查找问题
- 二分查找引出的问题
- [经典面试题]二分查找问题汇总
- 二分(折半)查找-经典算法
- 二分(折半)查找
- 二分查找要注意的问题
- HDU 2199 || HDU 2899 (二分查找+数学问题)
- 有序的静态查找表的折半(二分)查找算法
- 二分查找算法、折半搜索、二分搜索
- 关于二分查找的多个问题
- 二分查找问题全集OK
- 查找算法 分享2:折半(二分)查找
- 一个可能存在Bug的二分查找方法的实现,大家一起看看有什么问题没
- 二分查找需要注意的问题,以及在数据库内核中的实现
- 二分查找中的编程小问题