一、题目
一个长度为 n 的正整数数列,先递减再递增,设计一个O(logn)的算法找到最小值。
二、算法思路
利用二分的思想,每次查找list[mid]是不是最小值,
如果是就输出最小值并返回;
如果list[mid]位于递减的序列,就查找右边list[mid+1] ~list[r];
如果list[mid]位于递增的序列,就查找左边list[l] ~list[mid-1]。
三、代码
/*
10
6 4 2 1 3 5 7 9 11 13
*/
#include<iostream>
using namespace std;
int list[100];
int n;
int cnt=0;
void Search(int l,int r,int n){
cnt++;
if(n==1){
cout<<list[l]<<endl;
return;
}
int mid=(l+r)/2;
if(list[mid-1]>list[mid] && list[mid]<list[mid+1]){
cout<<"最小值为"<<list[mid]<<endl;
return;
}
else if(list[mid-1]>list[mid] && list[mid]>list[mid+1]){
cout<<"第"<<cnt<<"次查找的是" <<list[mid]<<endl;
return Search(mid+1,r,n-mid);
}
else if(list[mid-1]<list[mid] && list[mid]<list[mid+1]){
cout<<"第"<<cnt<<"次查找的是" <<list[mid]<<endl;
return Search(l,mid-1,n-mid);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>list[i];
Search(0,n-1,n);
cout<<"比较次数="<<cnt<<endl;
return 0;
}