特殊条件的二分查找
2012-06-11 20:57
323 查看
Q:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
A:任意将这个数组从中间分开,分成两个数组,则至少有一个数组单调递减,另一个数组则可以由递减数组左移若干位得到,所以我们在二分之后确定界限的时候必须考虑所有情况,即需要查找的数组在哪一个分区里。
首先我们需要判断哪一个分区是单调递减的分区,这可以通过比较arr[l]和arr[mid]来得到,如果是大于等于,则左分区是单调递减,否则是右分区;再通过判断要查找的值是否夹在递减分区中间来最终确定选择哪一个分区。
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
A:任意将这个数组从中间分开,分成两个数组,则至少有一个数组单调递减,另一个数组则可以由递减数组左移若干位得到,所以我们在二分之后确定界限的时候必须考虑所有情况,即需要查找的数组在哪一个分区里。
首先我们需要判断哪一个分区是单调递减的分区,这可以通过比较arr[l]和arr[mid]来得到,如果是大于等于,则左分区是单调递减,否则是右分区;再通过判断要查找的值是否夹在递减分区中间来最终确定选择哪一个分区。
#include <iostream> using namespace std; int FindData(int* arr,int value,int l,int r) { while(l<=r) { int mid=(l+r)/2; if(arr[mid]==value) return mid; else { if(arr[l]>=arr[mid]) { if(value>arr[mid] && value<=arr[l]) r=mid-1; else l=mid+1; } else { if(value<arr[mid] && value>=arr[r]) l=mid+1; else r=mid-1; } } } return -1; } int main() { int arr[]={4,3,2,1,6,5}; int n; cin >>n; cout <<FindData(arr,n,0,5)<<endl; return 0; }
相关文章推荐
- 二分查找的各种条件
- 简单的二分查找条件
- 二分查找 检查边界条件 Leetcode 33. Search in Rotated Sorted Array
- 二分查找 (最经典代码,及其边界条件的实践分析)
- 二分查找
- hdu 3763 CD(二分查找)
- NYOJ86找球号(一) 二分查找解决
- C语言排序(6)___送数字——(二分查找)
- 圆周舞蹈_纪中1745_二分查找
- 算法--Two sum之排序数字二分查找实现
- hdoj 5289 Assignment 【RMQ + 二分查找区间最优长度】
- 关于二分查找的应用拓展
- java基础知识4--数组,排序,二分查找
- 二分查找
- 二分查找--程序易出错的地方
- 二分查找(c & c++)
- 快速排序和二分查找
- 二分查找及简单应用
- 二分查找
- 数据结构——二分查找【转】