题目分析:
1.首先是有序数组,最小数字刚好是两个子数组的分界线,所以用二分查找
2.先判断数组是否为空,是则抛异常
3.设置俩指针,若p1所指大于p2,才说明有旋转,中值和它俩比较:
①都相等没法判断,需要用顺序查找。
②小于p1小于p2则说明是后边子数组的
③大于p1大于p2则说明是前边子数组的。
#include "stdafx.h"
#include<iostream>
using namespace std;
int MinInOrder(int arr[], int low,int high)
{
int temp = arr[low];
for(int i = low + 1;i != high; i++)
{
if(temp > arr[i])
temp = arr[i];
}
return temp;
}
int binSearch(int arr[],int length)
{
if(arr == NULL || length <= 0)
throw new std::exception("Invalid parameters");//如果数组为空,则抛出异常
int low = 0,high = length-1;
int mid = low;
while(arr[low] > arr[high])//说明数组有旋转
{
if(high - low == 1)//如果两个指针挨着,则第二个指针指的是最小的数
{
mid = high;
break;
}
mid = (low + high )/2;
//如果两个指针和中值所指的数都是一样如1 1 1 0 1这种,则需要用顺序查找
if(arr[low] == arr[high] && arr[high] == arr[mid])
return MinInOrder(arr,low,high);
if(arr[low] < arr[mid])//中值大于前边的,属于第一阵列,low指针指向mid
low = mid;
else if(arr[mid] < arr[high])//中值小于后边的,属于第二阵列,high指针指向mid
high = mid;
}
return arr[mid];
}
int main()
{
int arr[100] = {0};
int n = 0 ,i = 0;
cout << "输入数字个数:"<< endl;
cin >> n ;
int len = n;
while(n--)
{
cin >> arr[i];
i++;
}
cout << "最小的数是:" << binSearch(arr,len) << endl;
system("pause");
return 0;
}