小米笔试:循环排序数组二分查找
2012-10-26 20:03
381 查看
和一般的排序数组二分查找类似,下面这个链接中有详细讨论。
http://stackoverflow.com/questions/1878769/searching-a-number-in-a-rotated-sorted-array
大体思路如下:
如果arr[mid]==num,直接返回。
如果左边有序(有序与否只需检查左端点是否小于等于右端点,下同)且num在左边范围(检查是否在左右端点的数值之间,下同),则在左边找;
如果右边有序且num在右边范围,则在左边找;
如果左边无序,则在左边找;(分析:左右两边肯定至少有一边是有序的,这时左边无序,则右边肯定有序,而且前面的判断(第二个)说明不在右边,所以肯定在左边)
如果右边无序,则在右边找;
代码如下:
http://stackoverflow.com/questions/1878769/searching-a-number-in-a-rotated-sorted-array
大体思路如下:
如果arr[mid]==num,直接返回。
如果左边有序(有序与否只需检查左端点是否小于等于右端点,下同)且num在左边范围(检查是否在左右端点的数值之间,下同),则在左边找;
如果右边有序且num在右边范围,则在左边找;
如果左边无序,则在左边找;(分析:左右两边肯定至少有一边是有序的,这时左边无序,则右边肯定有序,而且前面的判断(第二个)说明不在右边,所以肯定在左边)
如果右边无序,则在右边找;
代码如下:
#include <iostream> using namespace std; int cbs(int arr[], int beg, int end, int num) { if(end - beg == 1) { if(arr[beg] == num) return beg; if(arr[end] == num) return end; return -1; } int mid = (beg + end) / 2; if(arr[mid] == num) return mid; if(arr[beg] <= arr[mid - 1] && num >= arr[beg] && num <= arr[mid - 1]) //left { return cbs(arr, beg, mid - 1, num); } if(arr[mid + 1] <= arr[end] && num >= arr[mid + 1] && num <= arr[end]) { return cbs(arr, mid + 1, end, num); } if(arr[beg] > arr[mid - 1]) return cbs(arr, beg, mid - 1, num); if(arr[mid + 1] > arr[end]) return cbs(arr, mid + 1, end, num); } int circularbinarysearch(int arr[], int len, int num) { return cbs(arr, 0, len - 1, num); } int main() { int arr[] = {13,14,15,16,17,1,2,3,4,5,6,7,8,9,10,11,12};//1: 5 int len = sizeof(arr) / sizeof(arr[0]); cout<<circularbinarysearch(arr, len, 13)<<endl; cout<<circularbinarysearch(arr, len, 17)<<endl; cout<<circularbinarysearch(arr, len, 1)<<endl; cout<<circularbinarysearch(arr, len, 12)<<endl; return 0; }
相关文章推荐
- 去哪儿笔试题——排序数组循环移位后查找
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 循环有序数组中的二分查找 Search in a rotated sorted array
- 数组排序、求最值、二分查找
- 在排序的数组中二分查找一个元素,返回在数组中它第一次出现的位置
- Java数组遍历、求最大值、选择排序、冒泡排序、二分查找
- 二分查找的变形,统计数字在排序数组出现的次数
- 剑指offer--面试题53 在排序数组中查找数字(二分)
- 例题3-8 使用whle循环和折半法查找一个整数是否在一个排序的int类型数组中
- 栋哥带你学Java数组排序和二分查找
- 二分查找与旋转排序数组 算法题
- 利用二分查找在循环递增数组中检索一个元素
- 黑马程序员_Java基础_04数组main函数args详解、数组排序、二分查找实例
- 51Nod-1001 数组中和等于K的数对【排序+二分查找】
- 二分查找的扩展问题,循环数组中查找某一数字
- 2014-04-04 循环递增数组查找元素(二分变形思想,百度面试题)
- 利用二分查找在循环递增数组中检索一个元素
- 【leetcode】在旋转排序数组中查找(二分)
- 二分数组的扩展:二分查找循环有序数组
- PHP 数组排序(冒泡排序、选择排序);数组查找(顺序查找、二分查找)