/*把一个组织最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。*/
#include "iostream"
#include "algorithm"
using namespace std;
int minRotatedArray0(int a[], int l, int u)
{
if (l == u)
return a[u];
else if ((u - l) == 1)
{
return a[u] > a[l] ? a[l] : a[u];
}
int m = (l + u) / 2;
if (a[m] < a[u])
return minRotatedArray0(a, l, m);
else if (a[m] > a[u])
return minRotatedArray0(a, m, u);
else
{
return min(minRotatedArray0(a, l, m), minRotatedArray0(a, m, u));
}
}
int minRotatedArray1(int a[], int l, int u)
{
int minValue = a[l];
for (int i = l+1; i <= u; i++)
{
if (a[i] < minValue)
{
minValue = a[i];
}
}
return minValue;
}
int minRotateArray(int a[], int length, const char* algorithm = "binarySearch")
{
if (algorithm == "oneByOne")
return minRotatedArray1(a, 0, length - 1);
else
return minRotatedArray0(a, 0, length - 1);
}
void arrayPrint(int a[], int N)
{
for (int i = 0; i < N; i++)
cout << a[i] << " ";
cout << endl;
}
#include "random"
#include "ctime"
#include "fstream"
#define N 2000
int a[N];
void test()
{
default_random_engine generator;
uniform_int_distribution<int> distribution(0, 100);
for (int i = 0; i < N; i++)
{
a[i] = distribution(generator);
}
sort(a, a + N);
int rotatePoint = distribution(generator);
rotate(a, a + rotatePoint, a + N);
ofstream file;
file.open("result.txt", ios::app);
clock_t t0 = clock();
for (int i = 0; i < 100; i++)
{
cout << minRotateArray(a, 6) << endl;
}
file << "binarySearch: " << clock() - t0 << "ms" << endl;
t0 = clock();
for (int i = 0; i < 100; i++)
{
cout << minRotateArray(a, 6, "oneByOne") << endl;
}
file << "oneByOne: " << clock() - t0 << "ms" << endl;
file.close();
}
int main()
{
test();
return 0;
}