查找旋转数组的最小值-- 二分查找

来源:互联网 发布:mac设置隐藏文件夹 编辑:程序博客网 时间:2024/05/21 18:02

假定一个排序数组以某个未知元素为支点做了旋转,如:原数组0 1 2 4 5 6 7旋转后得到 45 6 7 0 1 2。请找出旋转后数组的最小值。假定数组中没有重复数字

旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素

n   4 5 6 7 0 1 2

n   注意到实际上最小的元素就是两个子数组的分界线。

思路:           4 5 6 7 0 1 2


o   用两个指针low,high分别指向数组的第一个元素和最后一个元素。如果是正常的排序数组(元素间不重复),第一个元素肯定小于最后一个元素。

 

o   计算中间位置mid= (low+high)/2;

 

n   若:A[mid]>A[low],则A[low,low+1….mid-1,mid]是递增序列,最小元素位于子数组A[mid+1,mid+2,…high]中。因此,做赋值low=mid+1;

 

n   若:A[mid]<A[low],则A[low,low+1….mid-1,mid]不是递增序列,即:中间元素该子数组中,做赋值high=mid。

 

n   注:对偶地,若考察A[mid]与A[high]的关系,能够得到相似的结论。


原创粉丝点击