求陣列的最大值,次大值
在期末微機原理考試的時候,老師給我們出了一個題是求一段數的最大值,次大值,當時題目的要求使用匯編語言寫的,這裡我使用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.