在一个循环有序数组里查找一个给定的值是否存在

来源:互联网 发布:淘宝服务市场无线端 编辑:程序博客网 时间:2024/04/30 02:30

题目:

    一个循环有序数组(如:3,4,5,6,7,8,9,0,1,2),不知道其最小值的位置,要查找任一数值的位置。要求算法时间复杂度为log2(n)。

 思路

   我们可以把循环有序数组分为左右两部分(以mid = (low+high)/ 2为界),由循环有序数组的特点知,左右两部分必有一部分是有序的,我们可以找出有序的这部分,然后看所查找元素是否在有序部分,若在,则直接对有序部分二分查找,若不在,对无序部分递归调用查找函数。

二分查找

 #include <iostream>    using namespace std;    int binarySearch(int a[],int low,int high,int value)  //二分查找    {        if(low>high)            return -1;        int mid=(low+high)/2;        if(value==a[mid])            return mid;        else if(value>a[mid])            return binarySearch(a,mid+1,high,value);        else            return binarySearch(a,low,mid-1,value);    }    int Search(int a[],int low,int high,int value)     //循环有序查找函数    {        int mid=(low+high)/2;        if(a[mid]>a[low])       //左有序        {            if(a[low]<=value && value<=a[mid] )        //说明value在左边,直接二分查找            {                return binarySearch(a,low,mid,value);            }            else                                       //value在右边            {                return Search(a,mid+1,high,value);            }        }        else                    //右有序        {            if(a[mid]<=value && value<=a[high])            {                return binarySearch(a,mid,high,value);            }            else            {                return Search(a,low,mid-1,value);            }        }    }    int main()    {        int a[]={3,4,5,6,7,8,9,0,1,2};        cout<<Search(a,0,9,0)<<endl;        return 0;    }




Python代码:

def CycleBSearch(arr, val):  left = 0  right = len(arr) - 1  while left <= right:    mid = (left + right) / 2    if val == arr[mid]:      return mid          # found val    if arr[left] <= arr[mid]:      if arr[left] <= val < arr[mid]:        right = mid - 1   # val is in left side      else:        left = mid + 1    # val is in right side    else:      if arr[left] > val > arr[mid]:        left = mid + 1    # val is in right side      else:        right = mid - 1   # val is in left side  return -1               # cannot find val



阅读全文
0 0
原创粉丝点击