`

算法设计:如何求数组中第2大的数

 
阅读更多

一种思路是利用两次冒泡法,因为第一次冒泡,最大的在a[n-1],第二次冒泡后,次最大值在a[n-2]这样直接返回即可。核心代码如下:

for(int i=0; i<2; i++)
for(int j=0; j<n-i-1; j++)
{
	if(a[j] >a[j+1])
		swap(a[j], a[j+1]);
}
return a[n-2];

但是这样做,显然效率不够高,几乎要遍历两次,有没有遍历一次就可以找到呢?

第二种思路:

首先看源码:

int find2Max(int a[], int n)
{
	int max1 = 0; 
	int max2 = 0;
	for(int i=1; i<n; i++)
	{
		if(a[i] > a[max1])
		{
			max2 = max1;
			max1 = i;
		}
		else if(a[i] >  a[max2] && a[i] < a[max1])
			max2 = i;
	}
	return max2;
}


首先设置两个索引max1,max2,分别用来存最大的和次最大的索引。然后遍历一次,当a[i] > a[max1]时是一种情况,要进行交换;另外当a[i] < a[max1] 同时a[i] > a[max2]时,这种情况也要进行处理。注意,max1、max2的索引初值均为0, 有的人把max2设成-1,这是不够严密的。另外,就是遍历的时候,从第二个数开始遍历即可,即i = 1开始往后遍历。

这个算法的复杂度是o(n),问题似乎很好解决了,但试问有比这更快的方法吗?而且,如果不是让找第二大的数,而是找第三大、第四大、第五大,或者第三小、第4小的数,上面这种思路显然是走不通的。肿么办? 下篇接着说。

分享到:
评论

相关推荐

    算法实习:分治算法求n个数的数组中找出第二个最大元素

    ### 分治算法求解数组中第二大的元素 #### 背景介绍 在计算机科学领域,寻找数组中的最大或次大元素是常见的问题之一。这类问题不仅有助于理解数据结构的基本概念,也是评估算法效率和复杂度的良好案例。本文将探讨...

    c语言版本-求数组中第二大的元素

    这个 C 语言程序包括了一个 find_second_largest 函数,该函数接受一个整数数组和数组长度作为参数,并返回数组中第二大的元素。该函数使用一个 for 循环遍历数组中的每个元素,并根据算法中的步骤来更新最大元素和...

    matlab算法查找数组中第二大数:空间换时间的改进算法、分治策略的改进算法

    ### MATLAB算法查找数组中第二大数 #### 一、问题背景及需求分析 在计算机科学领域,查找数组中的第二大数值是一个常见的编程任务。本篇文章将详细探讨三种不同的算法方法:顺序比较算法、空间换时间的改进算法...

    Java经典算法题:查找数组中的最大值 非常清晰的代码结构

    本示例介绍了一种简单且高效的算法来寻找整数数组中的最大值。 首先,我们创建了一个名为`FindMaxInArray`的类,并在其中定义了一个`main`方法,这是Java程序的入口点。在`main`方法中,我们创建了一个名为`numbers...

    找到数组中第二大的元素 C语言实现

    在C语言中,找到数组中第二大的元素是一个常见的编程问题,尤其在数据结构和算法的学习中经常遇到。这个问题的关键在于如何有效地遍历数组并找出最大值和次大值。下面我们将详细讨论这个问题的解决方法。 首先,...

    java算法题 : 数组相关问题

    2. 最大子数组和:寻找数组中连续子数组的最大和,Kadane's算法可以在一次遍历中解决,时间复杂度为O(n)。 3. 翻转数组:给定一个数组,反转数组中的元素。可以通过两个指针从两端向中间遍历并交换元素实现。 4. ...

    取数组中的第2大值

    "取数组中的第2大值"是一个非常明确的标题,它告诉我们需要从给定的数组中找出第二大的元素的下标和值。这个问题非常常见,在实际编程中经常会遇到这种情况。 描述解释 "c语言实现取数组中的第2大值"是标题的详细...

    算法题示例-寻找数组中的第二大元素.rar

    算法题目:寻找数组中的第二大元素 题目描述: 给定一个非空整数数组,找出并返回其中第二大的元素。如果没有第二大的元素,则返回 -1。 输入示例: [1, 2, 3, 4] 输出示例: 3 解题思路: 初始化两个变量,first...

    查找第二大和第二小的数值,并查找数组中重复次数最高的数

    在C++编程中,查找数组中的第二大和第二小的数值以及重复次数最高的数是一项常见的算法问题,这涉及到数组处理和排序。以下将详细介绍如何通过C++来实现这一功能。 首先,我们要解决的是找到数组中的第二大和第二小...

    Java程序设计:5 数组与字符串.part3.ppt

    - 对于二维数组,intArray.length 返回行的数量,intArray[i].length 返回第i行的列数。 5. 数组的排序: - 冒泡排序:通过不断交换相邻元素来排序,需要n-1趟比较和交换,适用于小型数据。 - 选择排序:每趟...

    C程序设计:字符数组.ppt

    对于题目中的问题解答,要求创建一个四行四列的二维字符数组,并按列从大到小排序。首先,我们需要将二维数组转换成一维数组,然后使用排序算法(如冒泡排序或快速排序)对一维数组进行降序排列,再将排序后的一维...

    计算整形数组中第k小的数

    在IT行业的算法领域,计算整形数组中第k小的数是一个经典的编程问题,它涉及到排序、查找等基础知识,是衡量一个程序员基本功的重要指标之一。本文将深入解析这一知识点,包括其背后的算法原理、实现方法以及优化...

    c++数组求平均数函数

    根据给定的文件信息,我们可以总结出几个与C++中数组求平均数相关的知识点: ### 知识点一:理解数组及其操作 **数组定义**: - 数组是一种线性数据结构,它允许存储相同类型的数据元素。 - 在C++中,数组可以通过...

    从键盘输入一组整数,通过分治算法求第二大的数

    ### 分治算法求第二大的数 #### 背景与目的 在计算机科学领域,分治算法是一种重要的问题解决策略,被广泛应用于多种算法设计之中。分治算法的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,...

    二维数组求最大数

    ### 二维数组求最大数知识点解析 #### 一、题目背景与目标 本实验的目标是在一个二维数组中找出最大数及其所在的行和列位置。这是一个经典的编程问题,旨在帮助学习者掌握二维数组的基本操作以及如何在数组中进行...

    算法-数组排序 按数组内数字大小排序 取得最大值或最小值.rar

    2. 查找第二大、第三小等值: - 遍历法:在已排序数组中,找到最大值后,再遍历一次数组找到次大值。 - 优先队列(堆):使用最大堆结构,可以快速找到最大的k个元素。 三、排序算法的时间复杂度和稳定性 时间...

    matlab怎么求数组的长度和维数

    在MATLAB中,处理数组是日常编程中常见的任务,了解如何获取数组的长度和维数对于数据分析和算法实现至关重要。MATLAB提供了内置函数来帮助我们快速获取这些信息。以下是关于如何在MATLAB中求解数组长度和维数的详细...

    Python实现查找数组中任意第k大的数字算法示例

    在Python编程中,查找数组中第k大的数字是一项常见的任务,尤其在数据分析和算法竞赛中。这个任务通常涉及到数组操作,排序以及高效的查找技术。在给定的示例中,介绍了一个利用分治思想实现的算法,类似于快速排序...

    根据二维数组的第一列数值大小排序

    在二维数组中,每个元素通常由两个索引来定位,第一个索引代表行,第二个索引代表列。例如,我们可以用 `array[i][j]` 来访问二维数组中的某个元素,其中 `i` 是行索引,`j` 是列索引。 在给定的描述中,提到了根据...

    JAVA 数组:计算数组的和以及最大值

    数组在内存中是连续存储的,这使得访问和操作数组元素变得高效。在本主题中,我们将深入探讨如何计算Java数组的和以及找到数组中的最大值。 首先,让我们了解Java数组的基本概念。数组可以通过声明数组变量并指定...

Global site tag (gtag.js) - Google Analytics