循环有序数组查找一个数
2014-09-12 18:33
260 查看
网上看了有些代码有些错误,主要是下面实例中的0查找不到,这里重新更正了下
思想:循环数组有一边是有序的,首先先判断哪一边有序(通过将当前mid点与最左边节点比较),然后查看是否在有序边上
代码如下
非递归写法如下:
思想:循环数组有一边是有序的,首先先判断哪一边有序(通过将当前mid点与最左边节点比较),然后查看是否在有序边上
代码如下
#include<iostream> #include<assert.h> using namespace std; int Binary_Search(int *a,int low,int high,int value) { int mid=(low+high)/2; if(a[mid] == value) return mid; if(a[mid]>=a[low]) //左有序 { if(a[low]<=value && value<a[mid]) //说明value在左边,直接二分查找 { return Binary_Search(a,low,mid,value); } else //value在右边 { return Binary_Search(a,mid+1,high,value); } } else //右有序 { if(a[mid]<=value && value<=a[high]) { return Binary_Search(a,mid,high,value); } else { return Binary_Search(a,low,mid-1,value); } } } int main() { int A[10] = {7,8,9,0,1,2,3,4,5,6}; int p = Binary_Search(A,0,9,0); cout<<p<<endl; return 0; }
非递归写法如下:
#include<iostream> #include<stdio.h> #include<assert.h> using namespace std; int Binary_Search(int *A,int size,int value) { assert(A != NULL); int low = 0; int high = size - 1; while(low <= high) { int mid = (low + high) / 2; if(A[mid] == value) return mid; if(A[low] <= A[mid])//左有序,注意‘=’的使用 { if(A[low] <= value && value <= A[mid]) high = mid - 1; else low = mid + 1; } else//右有序 { if(A[mid] <= value && A[high] >= value) low = mid + 1; else high = mid - 1; } } } int main() { int A[10] = {7,8,9,0,1,2,3,4,5,6}; cout<<Binary_Search(A,10,5); return 0; }
相关文章推荐
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 在一个循环有序的数组里查找特定值
- 在一个循环有序数组里查找一个给定的值是否存在
- 算法9:在一个循环有序的数组里查找一个数
- 递增有序数组中,查找某一个数字的位置
- 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标
- 循环数组中查找一个数
- 循环有序数组中的二分查找 Search in a rotated sorted array
- 整数型的有序递增数组循环右移x位后,查找指定整数 算法
- 使用while循环和折半法查找一个整数是否在一个排序的int类型数组中
- 一个循环合并两个有序数组
- 在一个旋转过的有序数组上实现二分查找 收藏
- 在一个升序的但是经过循环移动的数组中查找指定元素
- 在一个二维有序数组中,查找指定的数据是否存在
- 利用二分查找在循环递增数组中检索一个元素
- 部分有序中查找给定值-【百度面试题】循环有序数组的查找问题
- 利用二分查找在循环递增数组中检索一个元素
- 循环有序数组查找问题
- 有序 循环数组的二分查找
- 二分数组的扩展:二分查找循环有序数组