问题:
1、给定一个循环数组arr,求循环有序数组的分界点
2、给定一个循环数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1。
~~~~~~~~~~~~~~~~~~~~~~~
循环数组arr:将有序数组向左循环移位,形成的数组为循环数组
即,有两个连续的子序列组成,但是整体上无序
举例:
有序数组:arr[8] = {2,3,3,3,3,5,6,7};
形成的某一循环数组:arr1[8] = {3,5,6,7,2,3,3,3};
这两个问题都是关于循环数组上的查找的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题1、给定一个循环数组arr,求循环有序数组的分界点
举例:
待查找数组:arr[8] = {3,5,6,7,2,3,3,3};
返回结果:可以返回i=3(表示3为分界点)
代码:
#include <iostream>
using namespace std;
int BinarySearchSplitPoint(int* arr,int len)
{
int low = 0;
int high = len - 1;
int mid = 0;
while(low < high - 1)
{
mid = low + ((high - low) >> 1);
if (arr[low] >= arr[mid] && arr[mid] <= arr[high])
{
high = mid;
}
else if(arr[low] <= arr[mid] && arr[mid] >= arr[high])
{
low = mid;
}
}
return low;
}
int main()
{
int arr0[8] = {3,5,6,3,3,3,3,3};
cout<<BinarySearchSplitPoint(arr0,8)<<endl;//返回2
int arr1[8] = {13,2,4,5,7,9,11,12};
cout<<BinarySearchSplitPoint(arr1,8)<<endl;//返回0
int arr2[8] = {2,3,4,5,6,7,8,9};
cout<<BinarySearchSplitPoint(arr2,8)<<endl;//无法处理
int arr3[8] = {3,3,3,3,3,3,3,3};
cout<<BinarySearchSplitPoint(arr3,8)<<endl;//无法处理
system("pause");
}
注意:上述代码处理的数组只能是循环数组,不能处理递增序列
如:都无法处理下面两个数组
arr2[8] = {2,3,4,5,6,7,8,9};
arr3[8] = {3,3,3,3,3,3,3,3};
问题2、给定一个循环数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1。
举例:
待查找数组:arr[8] = {6,7,8,9,1,2,4,5};
待查找数:v=2. 返回结果:i=5
待查找数:v=3 返回结果:i=-1
代码:
#include <iostream>
using namespace std;
int BinarySearch(int* arr,int len,int key)
{
int low = 0;
int high = len - 1;
int mid = 0;
while(low <= high)
{
mid = low + ((high - low) >> 1);
if (arr[mid] == key)
{
return mid;
}
if (arr[low] <= arr[mid] )//以mid为界,mid左边为增序,mid右边降序
{
if (arr[low]<= key && key < arr[mid])//普通的折半
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
else //以mid为界,mid左边为降序(逆序),mid右边增序
{
if (arr[mid] < key && arr[high] >= key)//在右边,为普通的折半
{
low = mid + 1;
}
else //在mid左边
{
high = mid - 1;
}
}
}
return -1;
}
int main()
{
int arr1[8] = {6,7,8,9,1,2,4,5};
cout<<BinarySearch(arr1,8,2)<<endl;//返回5
cout<<BinarySearch(arr1,8,3)<<endl;//返回-1
int arr2[8] = {2,3,4,6,8,9,13,15};
cout<<BinarySearch(arr2,8,13)<<endl;//返回6
cout<<BinarySearch(arr2,8,10)<<endl;//返回-1
system("pause");
}
注意:这里的代码还可以处理正常的自增序列
待查找数组:arr[8] = {2,3,4,6,8,9,13,15};
待查找数:v=13. 返回结果:i=6
待查找数:v=10 返回结果:i=-1
22