百度搜了几篇,太多了代码,实则苦涩难懂。面试笔试宝典总结的很给力。突然不能访问。以下是从百度快照中扒出来的。
次二分查找>:二分查找算法有两个关键点:1)数组有序;2)根据当前区间的中间元素与x的大小关系,确定下次二分查找在前半段区间还是后半段区间进行。
仔细分析该问题,可以发现,每次根据low和high求出mid后,mid左边([low, mid])和右边([mid, high])至少一个是有序的。
a[mid]分别与a[left]和a[right]比较,确定哪一段是有序的。
如果左边是有序的,若x<a[mid]且x>a[left], 则right=mid-1;其他情况,left =mid+1;
如果右边是有序的,若x> a[mid] 且x<a[right] 则left=mid+1;其他情况,right =mid-1;
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int binary_search_in_rotate_array(int a[], int n, int x) { int low = 0; �0�2 int high = n-1; //注意上界 �0�2 while(low <= high) { �0�2�0�2�0�2 int mid = low + ((high - low) >> 1); //可防止溢出;移位操作高效; �0�2�0�2�0�2 if(a[mid] == x) �0�2�0�2�0�2�0�2�0�2 return mid; �0�2�0�2�0�2 if(a[mid] >= a[low]) {//左半段有序 �0�2�0�2�0�2�0�2�0�2 if(x < a[mid] && x >= a[low]) { �0�2�0�2�0�2�0�2�0�2�0�2�0�2 high = mid -1; �0�2�0�2�0�2�0�2�0�2 } else { �0�2�0�2�0�2�0�2�0�2�0�2�0�2 low = mid + 1; �0�2�0�2�0�2�0�2�0�2 } �0�2�0�2�0�2 } else { //右半段有序 �0�2�0�2�0�2�0�2�0�2 if(x > a[mid] && x <= a[high]) { �0�2�0�2�0�2�0�2�0�2�0�2�0�2 low = mid + 1; �0�2�0�2�0�2�0�2�0�2 } else { �0�2�0�2�0�2�0�2�0�2�0�2�0�2 high = mid -1; �0�2�0�2�0�2�0�2�0�2 } �0�2�0�2�0�2 } �0�2 } �0�2 return -1; // 找不到,则返回-1 } |