思想:循环有序数组最大的特点是利用二分查找时,有一边总是有序的,利用这个特点,利用value存储历史最小值
当左边有序,则用A[low]与value比较即可得出当前左边的最小值,然后跳转到右边看是否存在更小的;
如果右边有序,则用A[mid]与value比较,得出右边的最小值,然后跳转到左边查看是否有更小的。
算法复杂度为O(logn)
代码如下:
#include<iostream> #include<stdio.h> #include<assert.h> using namespace std; int Binary_Search(int *A,int size) { assert(A != NULL); int low = 0; int value = A[0];//初始化 int high = size - 1; while(low <= high) { int mid = (low + high) / 2; if(A[low] <= A[mid])//左有序,注意‘=’的使用 { if(A[low] < value)//与左边有序的最小值比较 { value = A[low]; low = mid + 1;//跳转至右边试图寻找最小值 } else low = mid + 1; } else//右有序 { if(A[mid] < value)//与右边有序的最小值比较 { value = A[mid]; high = mid - 1;//跳转至左边试图寻找最小值 } else high = mid - 1; } } return value; } int main() { int A[10] = {4,5,6,7,8,9,0,1,2,3}; cout<<Binary_Search(A,10); return 0; }
时间: 2024-10-14 00:04:01