最普通的思路是2*N次的比较。
那么如何优化呢:
参考http://www.cnblogs.com/bestDavid/p/ExaminationALBABA.html
3、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。
解:把数组两两一对分组,如果数组元素个数为奇数,就最后单独分一个,然后分别对每一组的两个数比较,把小的放在左边,大的放在右边,这样遍历下来,总共比较的次数是 N/2 次;在前面分组的基础上,那么可以得到结论,最小值一定在每一组的左边部分找,最大值一定在数组的右边部分找,最大值和最小值的查找分别需要比较N/2 次和N/2 次;这样就可以找到最大值和最小值了,比较的次数为
N/2 * 3 = (3N)/2 次
如图会更加清晰:
代码实现:
#include <stdio.h>
#include <stdlib.h>
#define N 8
int main(void)
{
//int arr[N] = {4, 1, 5, 9, 9, 7, 10};
int arr[N] = {1,2,3,4,5,6,9,1};
int iter = 0;
int cnt = 0;
for(iter = 0; iter < N ; iter += 2)
{
if(++cnt && arr[iter] > arr[iter + 1] )
{
int temp = arr[iter];
arr[iter] = arr[iter + 1];
arr[iter + 1] = temp;
}
}
int i = 0;
for(i = 0; i < N; i++)
{
printf("%-3d", arr[i]);
}
printf("\n");
int myMin = arr[0];
for(iter = 2; iter < N ; iter += 2)
{
if(++cnt && arr[iter] < myMin)
{
myMin = arr[iter];
}
}
int myMax = arr[1];
for(iter = 3; iter < N; iter += 2)
{
if(++cnt && arr[iter] > myMax)
{
myMax = arr[iter];
}
}
if(N % 2 != 0 && ++cnt && myMax < arr[N - 1]) myMax = arr[N - 1];
printf("min is %d\n", myMin);
printf("max is %d\n", myMax);
printf("compare times is %d", cnt);
return 0;
}