最普通的思路是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;
}
面试题--尽可能的减少求一个数组的最大最小值的比较次数

相关文章:

  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
  • 2021-10-17
  • 2021-11-03
  • 2022-12-23
  • 2021-11-28
  • 2021-03-16
猜你喜欢
  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
  • 2021-08-21
  • 2022-12-23
相关资源
相似解决方案