同时找最大最小值

题目定义:

给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。

这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。

以下摘自《算法导论》:

事实上,我们只需要最多3⌊n/2⌋次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后对输入元素成对地进行处理。首先,我们将一对输入元素相互进行比较,然后把较小的与当前最小值进行比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。

  如何设定已知的最小值和最大值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最小值和最大值的初值都设为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就对前两个元素做一次比较,以决定最小值和最大值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。

贴一下我的代码:

int min;
int max;
void findMinMax(int arr[], int n, int &min, int &max)
{
    int begin = 0;
    if (n % 2 == 1)
    {
        min = max = arr[0];
        begin = 1;
    }
    else
    {
        if (arr[0] < arr[1])
        {
            min = arr[0];
            max = arr[1];
        }
        else
        {
            min = arr[1];
            max = arr[0];
        }
        begin = 2;
    }

    for (int i = begin; i < n-1; i = i+2)
    {
        if (arr[i] < arr[i+1])
        {
            if (arr[i] < min)
                min = arr[i];
            if (arr[i+1] > max)
                max = arr[i+1];
        }
        else
        {
            if (arr[i+1] < min)
                min = arr[i+1];
            if (arr[i] > max)
                max = arr[i];
        }
    }
}
时间: 2024-08-24 21:50:09

同时找最大最小值的相关文章

C语言:对传入sp的字符进行统计,三组两个相连字母“ea”&quot;ou&quot;&quot;iu&quot;出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 #pragma warning (disable:4996) 4 void fun(char*sp ,int *ct) 5 { 6 int a=0, b=0, c=0; 7 while (*sp != '\0') 8 { 9 if (*s

浙大版《C语言程序设计(第3版)》题目集 练习4-10 找出最小值 (20 分)

练习4-10 找出最小值 (20 分) 本题要求编写程序,找出给定一系列整数中的最小值. 输入格式: 输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔. 输出格式: 在一行中按照“min = 最小值”的格式输出n个整数中的最小值. 输入样例: 4 -2 -123 100 0 输出样例: min = -123 思路:假设输入的第一个是最小值,如果后面输入的小于最小值,更新最小值. 代码如下: #include <stdio.h> int main() { int n, i, mi

怎么找数组中10个元素最大和最小值

int max(int a[15]){ int max = a[0];   //定义max为数组的第一个元素的值 for (int i = 1; i<10; i++)  max = a[i]>max ? a[i] : max;    //轮流比较数组中10个元素,并找出最大值 return max;} int min(int a[10]){ int min = a[0];   //定义min为数组的第一个元素的值 for (int i = 1; i<10; i++)  min = a[i

LeetCode-Find Minimum in Rotated Sorted Array(找出反转数组中的最小值)

题1: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 题2:如果允许上题的数组有重复数字呢? 解法:最笨的方法,也是最容易想到的方法就是直接遍历数

找出最大值和最小值的时间复杂度比较小的一种方法

       一般认为,对于给定的n个数,只要独立地找出最小值和最大值,各用n-1次比较,最多2(n-1)次就可以找出最大值和最小值.        实际上,至多3(n/2)次比较就足以同时找到最大值和最小值,具体做法是:成对的处理元素,先将一对元素互相比较,然后将最小者与当前最小值比较,将较大者与当前最大值比较,因此每两个元素需要3次比较.这里要注意n的奇偶,当n是奇数,就将最小值和最大值都设置为第一个元素,然后成对的处理剩下的元素:如果n是偶数,就对前两个元素做一次比较,以决定最大值和最小值

python 三维数组找最小值

#声明三维数组 num=[[[33,45,67],[23,71,66],[55,38,66]], [[21,9,15],[38,69,18],[90,101,89]]] value=num[0][0][0]#设置main为num数组的第一个元素 for i in range(2): for j in range(3): for k in range(3): if(value>=num[i][j][k]): value=num[i][j][k] #利用三重循环找出最小值 print("最小值

heapq取列表最大或最小值元素

在一个集合中获取最大或者最小的n个元素,这时候就可以使用heapq模块中有nlargest和nsmallest函数可以达到需求 heapq介绍: heapq模块实现了python中的堆排序,并提供了有关方法.让用Python实现排序算法有了简单快捷的方式. >>> a=[1,2,5,9,72,-4] >>> import heapq #获取列表中最小的两个元素 >>> heapq.nsmallest(2,a) [-4, 1] #获取列表中最大的两个元素

算法导论(第9章-中位数和顺序统计学)最大值和最小值

n个数中同时找出最大值跟最小值: 例子:n = 7 5  1  2  3  6  4  8 方法一:独立地找出最大值和最小值,各用n-1次比较,共有2n-2次比较. 方法二:成对地处理元素,先将一对输入元素相互比较,然后把较小者与当前最小值比较,把较大者与当前最大值比较,因此每两个元素需要比较3次.(n为奇数时,将最大值和最小值都设为第一个元素的值,然后成对地处理余下的元素,总共做了3*[n/2]次比较,[]为下界.n为偶数时,就对前两个元素做一次比较,以决定最大值和最小值的初始值,然后成对地处

PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> #include <vector> #defin