1. 程式人生 > >求陣列的最大值,次大值

求陣列的最大值,次大值

在期末微機原理考試的時候,老師給我們出了一個題是求一段數的最大值,次大值,當時題目的要求使用匯編語言寫的,這裡我使用C++將相關演算法表現出來。

求陣列的最大值是很簡單的,基本上每個會程式設計的人都會求,但是求次大值就稍微有點彎了……

我當時的思路是這樣的:

因為這一段數字都是正整數,所以我通過兩次迴圈比較來實現,第一次遍歷求得最大值,然後將最大值對應的位置的數字置零,第二次遍歷求得次大值。

兩次遍歷的方法:

#include<iostream>
using namespace std;
int fun_max(int *a,int n)
{
	int max=a[0],k=0;
	for(int i=1;i<n;i++)
	{
		if(max<a[i])
		{
			max = a[i];
			k = i;		//用k儲存最大值的位置 
		}
	}
	a[k] = 0;	//最大值置零 
	return max; 
}
int main()
{
	int a[5]={1,40,6,7,10};
	cout<<"m1:"<<fun_max(a,5)<<endl;	//求得最大值並輸出,然後將最大值置零 
	cout<<"m2:"<<fun_max(a,5)<<endl;	//求得最大值置零之後的最大值,也就是次大值 
	return 0;
}

這樣做的是完全符合題意的,輸出結果也是正確的,但是這樣無疑破壞了陣列中原來的資料(雖然題目中沒有說不可以修改陣列中的資料),並且進行了兩次遍歷,總感覺方法不是很好。

考完之後,和同學交流知道了一種更好的方法,一種通過一次遍歷就可以得到結果,並且不會修改陣列中資料的方法:

讓陣列中的每個數和最大值比較:

如果a[i]>m1,就說明目前的“最大值m1”並不是最大值,而是a[i],所以將當前的最大值賦給次大值,然後將a[i]賦給m1;

如果a[i]<=m1,然後判斷ai]>m2是否成立,如果a[i]是小於最大值並且大於“次大值”的數,那個a[i]就是新的次大值。

一次遍歷的方法:

#include<iostream>
using namespace std;
int main()
{
	int a[5]={1,40,6,7,10};
	int m1=a[0],m2=a[0];
	for(int i=1;i<5;i++)
	{
		if(m1<a[i])
		{
			m2=m1;
			m1=a[i];	
		}
		else
		{
			if(m2<a[i])m2=a[i];
		}
	}
	cout<<"m1:"<<m1<<endl;
	cout<<"m2:"<<m2<<endl;
	return 0;
}

這個方法明顯要好得多……

當然,排序也是一種方法,一種思路是自己寫排序演算法,不過,我們沒有必要對這5個數都進行排序,只需要找到獲得排序結果的前兩個;另一種方法是利用stl中的排序演算法,這種方法使用簡單,但是無疑是做了一些無用功。

排序方法:

使用選擇排序法:
#include<iostream>
using namespace std;
int main()
{
	int a[5]={1,40,6,7,10};
	int k,temp;
	for(int i=0;i<2;i++)	//a[0] 和a[1]分別是最大和次大 
	{
		k = i;
		for(int j=i;j<5;j++)
		{
			if(a[j]>a[k])k=j;
		}
		temp = a[k];
		a[k] = a[i];
		a[i] = temp;
	}
	cout<<"m1:"<<a[0]<<endl;
	cout<<"m2:"<<a[1]<<endl;
	return 0;
}
使用stl的快速排序演算法: 
#include<iostream>
#include<cstdlib>
using namespace std;
int  com(const void *a,const void *b)
{
	return *(int *)a < *(int *)b;
}
int main()
{
	int a[5]={1,40,6,7,10};
	qsort(a,5,sizeof(a[0]),com);
	cout<<"m1:"<<a[0]<<endl;
	cout<<"m2:"<<a[1]<<endl;
	return 0;
}

輸出結果:

m1:40

m2:10

相關推薦

陣列

在期末微機原理考試的時候,老師給我們出了一個題是求一段數的最大值,次大值,當時題目的要求使用匯編語言寫的,這裡我使用C++將相關演算法表現出來。 求陣列的最大值是很簡單的,基本上每個會程式設計的人都會求,但是求次大值就稍微有點彎了…… 我當時的思路是這樣的: 因為這一段數字

java語言陣列、總和列印翻轉、擷取等操作

//Java陣列章節練習題 public class ArrayUtils{ //1.計算陣列中最大值 public static int arrayMaxElement(int[] data){ int max=data[0];

C語言陣列中的

#include<stdio.h> //改陣列大小隻需要修改 N後面的數字 #define N 5 int main(void){ int arr[N]={5,6,8,3,9}; int max= 0; //定義最大值並賦值 int mid= 0

紫色的手鏈(的異或

tdi 一個 data 不同的 col std 不同 date 格式 描述 那是木姑娘十七歲時,我送給她的生日禮物。(後來手鏈也成為了我最喜歡的出題媒介) 記得最初買的手鏈,由n段紫色的珠子構成,每一顆珠子都被賦予了一種價值評價w[i]。 為了木姑娘,我只惋惜自己不能摘下漫

leetcode-747-Largest Number At Least Twice of Others(vector的

mis bmi 函數 ret num 容易 浪費 ever leetcode 題目描述: In a given integer array nums, there is always exactly one largest element. Find whether the

類模板——陣列

問題及程式碼:/*。 *Copyright(c)2014,煙臺大學計算機學院 *All right reserved, *檔名:test.cpp *作者:liu_feng_zi_ *完成日期:2015年6月22日 *版本號:v1.0 *問題描述:類模板————求陣列最大值

字元陣列

輸入一個字元陣列,輸出其最大值和次大值 #include<stdio.h> #include<stdlib.h> #include<string.h> #defin

遞迴陣列(分治思想)

求陣列最大最小值我們可以用遍歷或者最簡單的排序方法來實現,但是那樣子的時間複雜度將會大很多,因此我們可以採用分治思想來求最大最小值,即先求左右兩部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然後再把左右兩部分的最大最小值合起來求總的最大最小值。 程式碼如下

javascript利用apply陣列

//高效能方法   function getMaxByArray2(arr){         return Math.max.apply(this,arr);    } //低效方法     fu

數組中

http 運行 else if ++ pre int mage 技術分享 分享圖片 一維數組,找出其中最大的數和第二大的數。 #include<stdio.h> void main() { int a[]={1,23,45,6,34,2,67,345,6

golang 陣列連續子陣列

直接上程式碼了 //x.1 求數組裡最長連續字陣列 O(n)內 func MaxSerialArr(arr []int) []int { //總長 var max = 0 //集合點 var jointIndex = -1 //結果集

【洛谷】4180:【模板】嚴格小生成樹[BJWC2010]【鏈剖】【線段樹維護、嚴格

P4180 【模板】嚴格次小生成樹[BJWC2010] 題目描述 小C最近學了很多最小生成樹的演算法,Prim演算法、Kurskal演算法、消圈演算法等等。正當小C洋洋得意之時,小P又來潑小C冷水了。小P說,讓小C求出一個無向圖的次小生成

用java實現分數各種運算(加減乘除兩個數中的較較小)

package Rational; import java.util.StringTokenizer; /** * @author SunKun * 分數四則運算 */ public class Calculator { int numerator; // 分子 int denominator

陣列欄位和簡潔有效的演算法

直接上程式碼:public static int max(int[] a){ int max = 0;int zmax = 0; for (int i = 0;i<a.length;i++){ zmax += a[

陣列連續子序列的和

HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,

SQL SERVER 讀取

       很多時候我們查詢資料都是查詢最大值或者最小值,一般都是利用Max或者Min函式來實現,一般很少求次大值的,其實實現也很簡單,記錄一下為大家提供一下思路,這篇部落格介紹一下利用ROW_NUMBER  PARTITION BY怎麼求次大值(

為雜湊表追加不重複的10個且每個都是1-10 之間的隨機數問哪個數字重複的次數重複了多少

#生成字典的結構 import random dictA={} for i in range(1,11): listA = [] for j in range(1,11): temp = random.randint(1, 10)

這樣的單點登入才有效果很多咖牛人都不知道!

導讀:單點登入,是指在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。本文從友戶通單點登入型別、認證安全以及應用整合的角度,聊下解決複雜場景下的單點登入方案。隨著雲端計算的飛速發展,越來越多的雲應用、雲服務充斥在日常的工作當中。人們在享受資訊化帶來的便捷的同時,也遭受著應用系統反覆登入,

這樣的單點登錄才有效果很多咖牛人都不知道!

roc 廣泛 ldap 支持跨域 jsonp 多次 社會化 而且 存在 導讀:單點登錄,是指在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。本文從友戶通單點登錄類型、認證安全以及應用集成的角度,聊下解決復雜場景下的單點登錄方案。隨著雲計算的飛速發展,越

apply()/call()陣列

var  numbers = [5, 458 , 120 , -215 ];  var  maxInNumbers = Math.max.apply(this, numbers);   console.