今天學(xué)習(xí)了求最大最小數(shù),這是一個(gè)很簡(jiǎn)單的算法,就是遍歷一次,然后依次跟當(dāng)前最大或最小的比較一下,遍歷結(jié)束,則選擇結(jié)束。
不過(guò)同時(shí)求最大最小的時(shí)候有點(diǎn)小技巧,就是我們兩個(gè)兩個(gè)的比較,把大個(gè)跟當(dāng)前最大比較,小的跟當(dāng)前最小的比較,這樣就會(huì)節(jié)約一點(diǎn)比較時(shí)間,有原來(lái)的2*n到3*n / 2。但是我覺得在代碼的可讀性上沒有直接兩次比較來(lái)的好。
雖然很簡(jiǎn)單,還是奉上源代碼:
#include <stdio.h>
#include <stdlib.h>
//得到最大最小值
int GetMaxMin(int nData[], int nLen, int* pnMax, int* pnMin)
{
int nMax = nData[0]; //初始化最大值為第一個(gè)元素
int nMin = nData[0]; //初始化最小值為第一個(gè)元素
int i; //下標(biāo)控制i
//遍歷元素,兩兩比較
for (i = 1; i + 1 < nLen; i += 2)
{
if (nData[i] > nData[i + 1]) //如果第一個(gè)數(shù)比第二個(gè)數(shù)大
{
if (nMax < nData[i]) //用第一個(gè)數(shù)與nMax比較
{
nMax = nData[i];
}
if (nMin > nData[i + 1]) //用第二個(gè)數(shù)與nMin比較。
{
nMin = nData[i + 1];
}
}
else //如果第一個(gè)數(shù)不大于第二個(gè)數(shù)
{
if (nMax < nData[i + 1]) //用第二個(gè)數(shù)與nMax比較
{
nMax = nData[i + 1];
}
if (nMin > nData[i]) //用第一個(gè)數(shù)與nMin比較
{
nMin = nData[i];
}
}
}
if (i < nLen) //確定是否都比較了,如果nLen為偶,可能最后一個(gè)數(shù)沒有比較
{
if (nMax < nData[i]) //比較最后一個(gè)數(shù)。
{
nMax = nData[i];
}
else if (nMin > nData[i])
{
nMin = nData[i];
}
}
*pnMax = nMax; //保存結(jié)果
*pnMin = nMin; //返回結(jié)果。
return 1;
};
//得到最小值
int GetMin(int nData[], int nLen)
{
int nMin = nData[0]; //初始化nMin為第一個(gè)數(shù)據(jù)
for (int i = 1; i < nLen; ++i) //遍歷數(shù)據(jù)一一同nMin比較
{
if (nMin > nData[i])
{
nMin = nData[i];
}
}
return nMin; //返回最小值
}
//得到最大值
int GetMax(int nData[], int nLen)
{
int nMax = nData[0]; //初始化nMax為第二個(gè)數(shù)據(jù)
for (int i = 1; i < nLen; ++i) //遍歷數(shù)據(jù)一一同nMax比較
{
if (nMax < nData[i])
{
nMax = nData[i];
}
}
return nMax; //返回nMax
}
int main()
{
int nData[10] = {8,2,5,9,3,6,4,7,1,6}; //測(cè)試
int nMax = GetMax(nData, 10);
int nMin = GetMin(nData, 10);
printf("%d %d\n", nMin, nMax);
GetMaxMin(nData, 10, &nMax, &nMin);
printf("%d %d\n", nMin, nMax);
system("pause");
return 0;
}