算法描述

算法:FINDSECOND

输入:n个数的数组a[0...n-1]

输出:数组中的第二大的数second

算法思路

选最大选最小算法中,我们将数组中的数两两分组进行比较,然后在较大的一组中选出最大的,在较小的一组中选出最小的,时间复杂度T(n)=⌈3n/2⌉-2,对比我们直接在整个数组中先选出最大,再选出最小时间复杂度T(n)=2n-3,时间复杂度更低。选第二大同样的道理,如果我们直接先选最大,再选第二大,时间复杂度同样是T(n)=2n-3。

因此选第二大算法我们也可以有类似的思路,采用锦标赛的形式将数组中的数两两分组进行比较,获胜的元素进入下一轮的比较,并且在比较中记录下所有对应获胜元素所淘汰的元素,当冠军元素也就是最大值max产生时,max所对应的所有被max淘汰的元素也被记录了下来,并且第二大的数second也在其中,然后我们只需要在这些元素中找最大的数即为第二大的数second。

算法实现的数据结构,锦标赛的比较过程可以概括为一个满二叉树,元素个数如若不足满二叉树则需进行补充。我们需要了解在满二叉树中父节点序号与儿子节点序号之间的关系,当父节点序号为k时,左儿子节点序号为2k,右儿子节点序号为2k+1。

假设当前我们需要从有5个元素的数组a[1,8,22,15,3]中选出第二大的数,那么第一轮比较的过程可以描述为一个满二叉树,如下图所示:

用一个数组b来存放这些数在数组a中的下标(注意此算法中所有的下标从1开始),为空的地方就赋值为-1,然后通过左右子树不断的比较,将大数放到父亲节点,一直到根节点,得到下图数组b的结构:

然后采用一个递归实现来进行第二次比较,递归地寻找到与最大数max比较的所有元素,然后从下往上覆盖最大数max,直到根节点就得到了第二大数second。

算法分析

常规算法先选出最大的数,再在剩余的数中选出最大的数就是原数组的第二大的数T(n)=n-1+n-2=2n-3。

选第二大算法时间复杂度计算如下:

第一阶段分组比较选出最大值,所有元素总共比较了n-1次
第二阶段在被max淘汰的⌈logn⌉个元素中选取最大比较⌈logn⌉-1次
则T(n)=n-1+⌈logn⌉-1=n+⌈logn⌉-2

算法实现

using namespace std;
#include<iostream>void pk(int* a, int* b, int bLen, int index, int max)
{int left = index * 2;int right = index * 2 + 1;//在满二叉树中迭代地寻找与最大数比较过的数//当找到存放最大数序号的叶子节点时将其改写为-1if (left > bLen || right > bLen){b[index - 1] = -1;return;}//如果左儿子是最大数则继续递归左儿子,反之递归右儿子if (b[left - 1] == max){pk(a, b, bLen, left, max);}else{pk(a, b, bLen, right, max);}if (a[b[left - 1] - 1] > a[b[right - 1] - 1]){b[index - 1] = b[left - 1];}else{b[index - 1] = b[right - 1];}
}int findSecond(int a[], int n)
{int x = 1;while (x < n){x = x << 1;}int* b = new int[2 * x - 1];//将b数组中后x个元素装入1到n的标号for (int i = 0; i < x; i++){if (i < n){b[x - 1 + i] = i+1;}else{b[x - 1 + i] = -1;}}for (int i = 2 * x - 2; i > 0; i-=2){if (b[i] < 0){if (b[i - 1] >= 0){b[(i - 1) / 2] = b[i - 1];}else{b[(i - 1) / 2] = -1;}}else{if (a[b[i] - 1] > a[b[i - 1] - 1]){b[(i - 1) / 2] = b[i];}else{b[(i - 1) / 2] = b[i - 1];}}}pk(a, b, 2 * x - 1, 1, b[0]);int second = a[b[0] - 1];delete[]b;return second;
}int main(void)
{int a[5] = { 1,8,22,15,3 };cout << findSecond(a, 5);
}

参考:

锦标赛(n个数中求第一和第二大的数)_有时间也搞搞算法!-CSDN博客

选第二大算法(锦标赛算法)相关推荐

  1. 选第二大元素python(分治)

    给定n个元素,找出元素中的第二大元素.该问题如果用线性扫描的方法的话, 首先找出最大值,比较n-1次 然后从n-1个元素中找出最大值,比较n-2次 下面考虑设计一个选第二大元素的分治算法 1.将n个元 ...

  2. 求解第二大元素——锦标赛算法(Tournament Algorithm)

    问题 给定一个长度为的数组,请用比较次数小于的算法求出数组中的第二大元素. 求解 看到题目中的比较次数小于就知道不能先用一次循环找出最大元素,接着利用最大元素再一次循环找到第二大元素. 那么,应该怎么 ...

  3. 一个特别有意思的算法——锦标赛算法

    我们应该多去研究我们学的专业,并在前辈所总结的知识道理上挖掘出更深的知识. 超越前辈是一种社会主潮流.如果我们这一代比起前辈没有进步,那社会怎么发展. 本篇介绍一个特别有趣的算法--锦标赛算法,运用锦 ...

  4. 【锦标赛算法】找第二大元素FindSecond()

    考虑找第二大元素,会想到调用两次Findmax()算法函数(推导可以参考上篇文章).先用Findmax()算法找出最大值,然后从L中删除max,再调用Findmax()找出剩下元素中的最大元素,就是输 ...

  5. java 算法之找出数组中第二大的数

    1.如果仅考虑实现功能而不考虑效率,可以先通过排序算法将数组排序,然后根据数组下标来访问数组中第二大的数,,最快的排序算法一般为快速排序算法,但是其时间复杂度为(nlogn),根据下标访问需要便利一遍 ...

  6. 算法---找到数组中第二大的数

    题目 找到无序数组中第二大的数 思路 我们可以用两个容器记录所有遍历过的元素中,第一大和第二大的数,在后续的遍历过程中,我们不断更新这两个值即可.时间复杂度O(n) 实现方法: public stat ...

  7. 蓝桥杯 ADV-100 算法提高 第二大整数

    问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束. 然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来. 说明:(1)0表示输入结束,它本身并不计入这组 ...

  8. [算法] 当今世界最为经典的十大算法--投票进行时

    当今世界最为经典的十大算法--投票进行时 ---------------------------------------- 第一部分.来自圣经的十大算法 第十名:Huffman coding(霍夫曼编 ...

  9. 第二讲 算法思想的发展历程

    第二讲   算法思想的发展历程 教学目标与教学指导: 算法思想源远流长,中国古代数学中就蕴涵了丰富的算法思想.随着现代信息技术飞速发展,算法在科学技术.社会发展中发挥着越来越大的作用,并且日益融入社会 ...

最新文章

  1. C#和JavaScript的简单互交
  2. 将Session写入Memcache
  3. mysql.zip免安装版配置
  4. Axure RP Pro - 翻译 - Download下载 - Axure RP Pro 5.5.0.1955
  5. 科技部:推进人工智能和实体经济深度融合 壮大智能经济
  6. 物联网大数据平台有哪些功能特点
  7. 声纹技术:让智能语音助手真正“认得”自己
  8. :hover 鼠标悬浮时(基本导航)
  9. wordpress后台加载速度异常缓慢排查记录(原创)
  10. 【ArcGIS|3D分析】要素的立体显示
  11. java权限管理框架Shiro(最近学习整理)
  12. 数据分析师mysql面试题_30个sql面试题及答案(数据分析师福利)
  13. ajax 获取访问者ip,jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
  14. 【一周头条盘点】中国软件网(2018.1.15~2018.1.19)
  15. 调试sim800L模块
  16. R语言中dim函数_R语言在医学统计中的应用基础教程
  17. 微型计算机显卡,“智能”显卡 华硕ROG Matrix显卡赏析
  18. Hypervisor 技术的演进
  19. 注册中心开源方案选型
  20. 【Vue项目复习笔记】详情页的展示

热门文章

  1. OpenCV + CPP 系列(十九)直方图比较 与 直方图反向投影,投影分割
  2. 关于第二次考试的总结与反思
  3. 计算机应用基础名词解释动画,《计算机应用基础》期末考试复习题库-名词解释题题库...
  4. AIOC快速卸载3dsmax2014
  5. [附源码]计算机毕业设计JAVA中学学生学籍管理
  6. 1.4.17 实验17:ASBR
  7. 大数据学习之一——Hadoop单机部署
  8. python如何实现微信自动聊天_如何利用python实现微信智能聊天功能,具体该怎么做?...
  9. EXCEL数据分析——分列
  10. 大疆云台如何使用华为mate20pro_mate20pro 进阶功能吐槽和分析