方法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;
}
執行結果:
頂 0
求陣列的最大值和最小值
求陣列的最大最小值,可以遍歷一遍陣列,然後分別記錄最大值和最小值,這種方法需要的比較次數為2n次。如果想要減少比較次數,可以採用的方法是遍歷陣列,然後比較相鄰元素,把相鄰元素的較大值放在後面,較小的放在前面。在從較大值中選取最大值即為整個陣列的最大值,從較小值中選取最小值即為整個陣列的最小值。這時,...
求陣列的最大值最小值
演算法陣列中的最大值和最小值 方法1 遍歷兩次求出最大值最小值 時間複雜度n 2 方法2 相鄰兩個數分為一組比較,大的放在偶數字,小的放到奇數字,然後在偶數字上找到最大值,在奇數字上找到最小值n 1.5 方法3 定義兩個變數max,min值,相鄰兩個數分為一組,比較出最大值和最小值,最大值和max比...
求陣列中的最大值或者最小值
math.max value1 value2,max 是 math 的靜態方法,所以應該像這樣使用 math.max 而不是作為 math 例項的方法 簡單的來說,就是不使用 new 如果沒有引數,則結果為 infinity 注意是負無窮大 math.max true,0 1 math.max tr...