程式設計之美4 求陣列中的最大值和最小值

2021-08-04 16:44:14 字數 3583 閱讀 7681

方法1:暴力方法 遍歷一遍陣列,比較2*n次求出最大值和最小值

方法2:改進方法 (破壞了原陣列)

遍歷一遍陣列使得下標為偶數的元素較下標為奇數的元素大,再分別求出最大值和最小值

比較次數為3*n/2次

方法3:改進方法 (不破壞原陣列)

遍歷一遍陣列將相鄰元素中較大值和nmax比較,將較小值和nmin比較

比較次數為3*n/2次

方法4:改進方法 

分治思想

,先分別求出前半部分和後半部分陣列的最大值和最小值,

然後兩部分中的最大值和最小值分別比較求出整個陣列的最大值和最小值

比較次數為3*n/2-2次

**如下:

[cpp]view plain

copy

// 求陣列中的最大值最小值.cpp : 定義控制台應用程式的入口點。

#include "stdafx.h"

#include 

using

namespace

std;  

//方法一:暴力方法 遍歷一遍陣列,比較2*n次求出最大值和最小值

void

findmaxandminmethod1(

int*parr, 

intnlength, 

int&nmax, 

int&nmin)  

nmax = parr[0];  

nmin = parr[0];  

for(

inti=1; i

if(nmax 

}  }  //方法二:改進方法 (破壞了原陣列)

//遍歷一遍陣列使得下標為偶數的元素較下標為奇數的元素大,再分別求出最大值和最小值

//比較次數為3*n/2次

void

findmaxandminmethod2(

int*parr, 

intnlength, 

int&nmax, 

int&nmin)  

if(nlength == 2)

//陣列只有兩個元素

else

return

;  }  

//遍歷一遍陣列使得下標為偶數的元素較下標為奇數的元素大

for(

inti=0; i

}  //求最大值

nmax = parr[0];  

for(

intj=2; j

}  //求最小值

nmin = parr[1];  

for(

intt=3; t

}  }     

}  //方法三:改進方法 (不破壞原陣列)

//遍歷一遍陣列將相鄰元素中較大值和nmax比較,將較小值和nmin比較

//比較次數為3*n/2次

void

findmaxandminmethod3(

int*parr, 

intnlength, 

int&nmax, 

int&nmin)  

if(nlength == 2)

//陣列只有兩個元素

else

return

;  }  

//初始賦值

if(parr[0] > parr[1])  

else

for(int

i=2; i

if(nmin > parr[i])

//將較小值和nmin比較

}  else

if(i+1  parr[i+1])  

if(nmin > parr[i+1])

//將較小值和nmin比較

}  else

//最後剩下乙個元素

if(nmin > parr[i])  

}  }         

}     

}  //方法四:改進方法 

//分治思想,先分別求出前半部分和後半部分陣列的最大值和最小值,

//然後兩部分中的最大值和最小值分別比較求出整個陣列的最大值和最小值

//比較次數為3*n/2-2次

void

findmaxandminmethod4(

int*parr, 

intnstart, 

intnend, 

int&nmax, 

int&nmin)  

else

return

;  }  

intnleftmax = 0;  

intnleftmin = 0;  

intnrightmax = 0;  

intnrightmin = 0;  

findmaxandminmethod4(parr, nstart, nstart+(nend-nstart)/2, nleftmax, nleftmin);  

findmaxandminmethod4(parr, nstart+(nend-nstart)/2+1, nend, nrightmax, nrightmin);  

nmax = nleftmax > nrightmax ? nleftmax : nrightmax;  

nmin = nleftmin 

}  int

_tmain(

intargc, _tchar* argv)  

;//int narr[2] = ;

//int narr[3] = ;

intnarr[5] = ;  

intmax = 0;  

intmin = 0;  

findmaxandminmethod1(narr, 5, max, min);  

cout <

<

" 最小值為:"

<

max = 0;  

min = 0;  

findmaxandminmethod2(narr, 5, max, min);  

cout <

<

" 最小值為:"

<

max = 0;  

min = 0;  

findmaxandminmethod3(narr, 5, max, min);  

cout <

<

" 最小值為:"

<

max = 0;  

min = 0;  

findmaxandminmethod4(narr, 0, 4, max, min);  

cout <

<

" 最小值為:"

<

system("pause"

);  

return

0;  

}  

執行結果:

來自:

《程式設計之美》 求陣列的子陣列的最大值

問題 求陣列的子陣列的最大值 分析與解法 解法一 窮舉法,把每個子陣列的和求出來並比較,輸出最大值。時間複雜度為o n 2 int maxsum int arr,int n return max 解法二 將所給的陣列分為長度相等的兩部分,分別求出兩個陣列各自的最大子陣列的和,那麼原陣列的最大子陣列的...

程式設計之美 求陣列的子陣列之和的最大值

前段子時間舍友恒恒問了我乙個問題 怎樣在乙個陣列中找到乙個子陣列使得各個元素之和最大,當時自己想了片刻,設定乙個變數sum,就說從左邊開始變數整個陣列,乙個個相加到sum中,發現了sum 0的話,就把sum設定為0就可以了,後來想了下,得到的結果未能保證正確,我們應該在遍歷的過程中儲存下sum的最大...

求陣列的子陣列之和的最大值(程式設計之美)

題目要求 乙個有n個整數元素的一維陣列 a 0 a 1 a n 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列中和最大值是多少呢?1 子陣列是連續的 2 求子陣列的和,不用求子陣列的具體位置 3 陣列的元素時整數,所以陣列可能包含有正整數 零 負整數 解法一 暴力解法,從陣列的第0位開始遍歷陣...