[算法导论]在一个数组中寻找最大值和最小值所需要进行比较的次数

求一个数组中的最大值和最小值,要求将比较次数减小至3N/2 1、取双元素法 每次取两个元素,用较小的和最小值比较,用较大的和最大值比较,那么总共会取N/2次,每取一次会进行三次比较,第一次比较当前两个元素,第二次较小的和当前最小值比较, 第三次较大的和当前最大值比较,总的比较次数便是:3N/2。需要注意的是: (1)输入数组的合法性检查(空指针或者数组的长度为0); (2)边界检查:输入数组只有1个元素,那么最小值和最大值均为该元素; (3)初始 阅读详情

数组大小为ArraySize,若ArraySize为偶数,则需要(n-2)/2×3+1次比较;若ArraySize位奇数,则需要(n-1)/2×3次比较。以两个数为一组,首先比较这两个的大小,然后分别与当前最小值和最大值比较。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

#define GetMinAndMax(a, b, minimum, maximum, times) \
({ \
    unsigned int arg1 = (a); \
    unsigned int arg2 = (b); \
    (minimum) = MIN(arg1, arg2); \
    (maximum) = MAX(arg1, arg2); \
    (times)++; \
    printf("time %3d: Compared %3d and %3d\n", times, arg1, arg2); \
})

#define ARRAY_SIZE  99
static int _Array[ARRAY_SIZE];

static void InitArray(void)
{
    srand((unsigned int)time(NULL));
    for(int i = 0; i < ARRAY_SIZE; i++)
        _Array[i] = rand() % (ARRAY_SIZE * 10);

    return;
}

static void PrintArray(void)
{
    for(int i = 0; i < ARRAY_SIZE; i += 5)
    {
        printf("%d\t%d\t%d\t%d\t%d\n",
            _Array[i], _Array[i + 1], _Array[i + 2], _Array[i + 3], _Array[i + 4]);
    }

    return;
}

static void Findminimum(void)
{
    unsigned int times = 0;
    int minimum;
    int maximum;
    int beginIndex;
    int tempMinimum;
    int tempMaximum;

    if(ARRAY_SIZE % 2 == 0)
    {
        GetMinAndMax(_Array[0], _Array[1], minimum, maximum, times);
        beginIndex = 2;
    }
    else
    {
        minimum = maximum = _Array[0];
        beginIndex = 1;
    }

    for(int i = beginIndex; i < ARRAY_SIZE; i += 2)
    {
        GetMinAndMax(_Array[i], _Array[i + 1], tempMinimum, tempMaximum, times);
        GetMinAndMax(minimum, tempMinimum, minimum, tempMinimum, times);
        GetMinAndMax(tempMaximum, maximum, tempMaximum, maximum, times);
    }
    printf("Has compared %d times, and minimum is %d, maximum is %d\n", times, minimum, maximum);
}

int main(int argc, char * argv[])
{
    InitArray();
    PrintArray();
    Findminimum();

    return EXIT_SUCCESS;
}
编程之美_2.10_寻找数组中的最大值和最小值 问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值 注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率 方法一、遍历一遍数组,同时得到最大值和最小值 具体是,定义一个max 和 min,每遍历一个数,就分别和max 和 min比较一次,直到处理完所有的数据 比较次数: N+N = 2N 方法二、我们可以把数组中的数据两两 阅读详情

相关推荐

如何寻找数组中的最大值和最小值

以下五种解法可以寻找到数组中的最大值和最小值; 1)问题分解法。     把本题看做两个独立的问题,而非一个问题,所以,每次分别找出最小值和最大值即可,此时,一共需要遍历两次数组,比较次数为2N次;(N表示数组的长度)  2)取单元素法。     维持两个变量min和max,min标记为最小值,max标记为最大值,每次取出一个元素,先与已找到的最小值比较,再与已找到的最大值比较,此种方法只

来者即是客,请坐~ 1万+

编程之美--寻找数组中的最大值和最小值

1、题目:对于一个由N个整数组成的数组,

woshibendangao的专栏 1140

算法导论 — 9.1最小值和最大值

算法导论 9.1 - 最小值和最大值

yangtzhou的专栏 2893

无序数组中求最大值和最小值的最少比较次数

无序数组中求最大值和最小值的最少比较次数 原理介绍 求一个无序数组中的最大值和最小值是一个很常见的情况, 一般来说, 最大值和最小值不是同一个元素, 我们可以通过下面几种方法来求: 排序算法:将数组排序后, 第一个元素是最小值,最后一个元素是最大值,以快排平均复杂度为例,时间复杂度 O(NlogN)O(NlogN)O(NlogN),空间复杂度: O(logN)O(logN)O(logN),比较...

Fxxk CPP 2288

编程之美3:寻找数组中的最大值和最小值以及最大值和次大值

很开心,这是今天的第三篇文章啦!下午健身也感觉非常过瘾,托付宿舍妹子从日本代购的护肤品也到了。耳边漂浮着Hebe田馥甄的《魔鬼中的天使》文艺的声线,一切都好棒,O(∩_∩)O哈哈~。爱生活,爱音乐,爱运动,额,当然还有要爱学习啦!加油↖(^ω^)↗额,扯远了。第三篇是关于寻找数组中的最大值和最小值。第一次看到这个题目的时候,楼主稍微鄙视了一下,因为觉得这个题目有什么好做的。但是楼主还是看了看《编程之

XIAXIA__的专栏 5299

【C++学习笔记】一、数组寻找最大值最小值

查询数组中的最值 查找数组中的数指 求和

没有手牌的博客 4579

从数组中查找最值(三种基本算法)

程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢?所以这里简单提供了三种比较常见的算法来查找数组中的最值(这里以查找最大值为例)

phy_on的博客 2万+

[编程之美] PSet2.10 寻找数组中的最大值和最小值

 问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值 注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率。

飞扬的青春的专栏 1026

设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。

先遍历一遍数组,两个两个分成一组,小的放在左边大的放在右边,这样比较次数是N/2。N是数组的长度。然后最小的元素一定是在每组的左边,最大的元素在右边。下一步在左边的所有元素中比较N/2次产生最小的,在右边的元素中比较N/2次产生最大的。总共需要比较的次数是3*(N/2)次。代码如下 #include #include using namespace std; int main()

Sailor Moon的博客 7078

GD32 TIMER0 PWM输出死活没波形?别忘了这个关键配置(附完整代码)

本文详细解析了GD32 TIMER0 PWM输出无波形的常见问题,特别强调了高级定时器特有的主输出使能配置。通过完整的代码示例和调试技巧,帮助开发者快速解决PWM输出问题,适用于无刷电机控制等嵌入式应用场景。

weixin_30906185的博客 397

PSINS惯性系初始对准与代码解读

本文参考“摇摆基座上基于信息的捷联惯导粗对准研究”(秦永元),以及“严恭敏博士后研究报告”,详细解读并推导了静基座惯性系对准算法,并与PSINS代码进行对照解读。

u011012050的博客 6752

寻找数组最大值和最小值:多种算法详解

在编程中,我们经常需要在数组(或列表)中查找最大值和最小值。这是一个基础但重要的问题,理解不同的解决方法有助于提高算法思维能力。查找数组中的最大值和最小值是一个基础但重要的问题。三种主要算法普通线性扫描法:简单直观,适合教学和小数据分治算法:适合并行处理,是学习递归的好例子成对比较法:性能最优,实际应用首选算法选择原则根据数据规模和场景选择合适算法考虑时间复杂度和空间复杂度的权衡注意代码的可读性和维护性实际应用数据分析中的基本统计图像处理中的对比度调整游戏开发中的成绩管理。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 9734

用Java实现森林冰火人游戏

g.drawString("游戏结束", CELL_SIZE * COLS / 2 - 100, CELL_SIZE * ROWS / 2);g.drawString("难度级别: " + difficultyLevel, 10, CELL_SIZE * ROWS + 60);g.drawString("生命值: " + playerHealth, 10, CELL_SIZE * ROWS + 20);setTitle("森林冰火人");

2401_82778412的博客 1734

寻找数组中的最大值和最小值

问题来源:《编程之美》2.10 寻找数组中的最大值和最小值 对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢? 1. 遍历两次数组,分别找出最大值和最小值。需要进行 2 * N 次比较 2. 将数组中的元素分组,按顺序将数组中相邻的两个数分在同一组,用Max和Min来存储最大值和最小值,同一组比较完之后,较小的数与当前的最小值比较,如该数小于当前最小值,更新M

CaryaLiu的专栏 1万+

RK3588开发笔记-Buildroot编译host-nodejs报错解决ModuleNotFoundError: No module named ‘_bz2‘

在RK3588的开发过程中,使用Buildroot进行系统的构建和编译是一个常见的选择。然而,在编译host-nodejs的过程中,有时会遇到报错信息提示。这个错误通常是由于Python环境中缺少相应的模块导致的。以下将记录我解决这个问题的过程。。在RK3588的开发过程中,使用Buildroot编译host-nodejs时遇到的错误,通常是由于缺少相应的Python模块导致的。通过配置buildroot pythong bzip2开发库并重新编译,可以解决这个问题。

flypig has a dream! 898

Transformer在BEV感知中的统治地位

Transformer在BEV感知中的统治地位 ,人工智能,计算机视觉,大模型,AI,本文围绕 Transformer 在 BEV 感知中的统治地位展开,介绍了 Transformer 的基础原理,如自注意力、多头注意力机制等,以及 BEV 感知的概念、任务与挑战。阐述了 Transformer 在 BEV 感知中的技术优势,包括全局建模、灵活特征融合和长距离依赖捕捉能力,还介绍了典型架构、代码示例及在自动驾驶目标检测等领域的应用案例。同时,评估了其性能,提及优化方法,并展望了与其他技术融合、端到端系统等…

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

编程之美——寻找数组中的最大值和最小值

编程之美——寻找数组中的最大值和最小值 问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值 注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率 方法一、遍历一遍数组,同时得到最大值和最小值 具体是,定义一个max 和 min,每遍历一个数,就分别和max 和 min比较一次,直到处理完所有的数据

chenglinhust的专栏 6785

用 ADBC 把动态查询做得又快又稳:从 CL_SQL_STATEMENT 到安全取数的工程化实践

本文介绍了ABAP中ADBC(ABAP Database Connectivity)技术的核心用法与最佳实践。ADBC作为Open SQL的补充,适用于动态查询、数据库特性调用等场景。文章通过示例代码详细演示了使用ADBC执行查询的完整流程:创建SQL语句、执行查询获取结果集、批量装载数据到内表,以及分包读取处理大数据量。特别强调了动态SQL的安全防护措施,包括输入转义和参数绑定等防注入技术。同时对比了ADBC与Open SQL的适用场景,指出ADBC更适合需要动态访问数据库原生功能的场合。文章还分析了代码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1770

数组参数:交换数组中最大值和最小值的位置

题目:定义一个函数,功能:实现数组中最大值和最小值交换位置。 解题思路:定义一个数组参数的函数,首先要先找到数组元素中的最大值和最小值,然后用我们常用的方法来将最大值和最小值进行转换。最后在main函数中调用所定义的f函数。 #include<stdio.h> int f(int x[], int n) //定义数组参数 { int i, m=0, j=0; for(i=1;i<n;i++) { if(x[i]>x[m]) //找出最大值 {m=i;} if(

qq_46724903的博客 1万+

杰理SDK入门教程(五):按键使用配置

摘要 杰理SDK提供IO按键和AD按键两种方案。IO按键通过GPIO电平检测实现,配置时需要设置板级宏定义和硬件连接,默认使用PB1引脚。AD按键基于ADC电压采样,通过电阻分压区分按键,需配置功能使能、硬件通道和键值适配。按键功能通过修改SDK中的key_table文件实现。两种方案适用于不同硬件场景,开发者可根据需求选择。

qq_42014563的博客 775

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3581

java中定义一个数组,获取数组中的最大值和最小值

思路 :   我们定义一个数组,再定义一个max变量 用来存在最大值  ; 再定义一个min变量,用来存在最小值;   我们遍历数组,假如当前值大于max,就把当前值赋值给max; 假如当前值小于min,就把当前值赋值给min;   我们给下示例代码: public class Test {       public static void main(String[] arg...

weixin_41934292的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

给定一个数组,输出这个数组中的最大值和最小值

/** * @author LLJ * @time 2020-5-6 17点06分 * @Description 给定一个数组,输出这个数组中的最大值和最小值 */ public class BigAndSmall4 { public static void main(String[] args) { int a[] = {6,34,23,41,87,3,7}; minMa...

静默 9193

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【ARM汇编数组】输出数组中最大值最小值

找出最小值最大值的思想是:遍历数组中的元素,出现一个数比较两次。以此保证r6中存放的永远是最小的,r8存放的永远是最大的。 用CMP和带后缀指令不断更新最大值最小值。 [r5,#-4] 这种寻址方式不改变r5的值,[r5,#-4]!这种方式是前索引改变r5的值。

GRT609的博客 3527

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java定义一个数组,输出数组中的最大值和最小值

题目 定义一个数组,输出数组中的最大值和最小值 public class TestArray1 { public static void main(String[] args) { int[] a = new int[] {1, 2, 655, 34, 98, 66};//定义数组 int max = a[0];//默认第一个数,让其他数和第一个数作比较,之后交换 int min...

奈何的人生 1万+
上一篇: [内核源码][编译] 关于openssl/opensslv.h错误的解决方案
下一篇: [代码实例][Bash]创建时间相关的目录
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值