已给有序序列中
查找x是否在数组中
int ab[num];
int search(int x)
{
int f=0;
int l=num-1;
int mid;
while(f<=l)
{
mid=(f+l)/2;
if(ab[mid]==x)
return 1;
else if(ab[mid]<x)
f=mid+1;
else if(ab[mid]>x)
l=mid-1;
}
return 0;
}
2.查找X出现的下标
//查找x第一次出现的下标,不存在返回-1
int search(int x)
{
int low=0;
int high=n-1;
while(high>=low)
{
int mid=(low+high)/2;
if(a[mid]>=x)
high=mid-1;
else
low=mid+1;
}
return a[high+1]==x?high+1:-1;
}
//查找x最后出现的下标,不存在返回-1
int search(int x)
{
int low=0;
int high=n-1;
while(high>=low)
{
int mid=(low+high)/2;
if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return a[low-1]==x?low-1:-1;
}
3.给定一个有序的数组,查找最接近 value 且大于 value 的数的下标,不存在返回 - 1。
int BinarySearch(int array[], int n, int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid =( low+high)/2;
if (a[mid] >x)
high= mid - 1;
else
low= mid + 1;
}
return a[high+1] >x ? high+1 : -1;
}
如果问题改为查找最接近 value 且小于 value 的数的下标呢?只需改动两个位置:
1.if (a[mid] >x)加入一个等号;
2.return a[high+1] >x ? hight+1:-1;改为return a[low-1] <x? low-1:-1;。
问题 4
给定一个轮转后的有序数组(所谓转轮有序数组,比如:{2, 3, 4, 5, 1},{ 5, 1, 2, 3, 4 }),查找 value 是否在数组中,不存在返回 - 1。
int BinarySearch(int array[], int n, int value)
{
int left = 0;
int right = n - 1;
while (left <= right)
{
int middle = left + ((right - left) >> 1);
if (value < array[middle])
{
if (array[middle] < array[right])
right = middle - 1;
else
{
if (value < array[left])
left = middle + 1;
else
right = middle - 1;
}
}
else if (value > array[middle])
{
if (array[middle] > array[left])
left = middle + 1;
else
{
if (value > array[right])
right = middle - 1;
else
left = middle + 1;
}
}
else
return middle;
}
return -1;
}
理解上面的代码很简单,只需从三个方面考虑:
{1, 2, 3, 4, 5},
{2, 3, 4, 5, 1},
{5, 1, 2, 3, 4}。