今天學習了求最大最小數,這是一個很簡單的算法,就是遍歷一次,然后依次跟當前最大或最小的比較一下,遍歷結束,則選擇結束。
不過同時求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2*n到3*n / 2。但是我覺得在代碼的可讀性上沒有直接兩次比較來的好。
雖然很簡單,還是奉上源代碼:
#include <stdio.h>
#include <stdlib.h>
//得到最大最小值
int GetMaxMin(int nData[], int nLen, int* pnMax, int* pnMin)
{
int nMax = nData[0]; //初始化最大值為第一個元素
int nMin = nData[0]; //初始化最小值為第一個元素
int i; //下標控制i
//遍歷元素,兩兩比較
for (i = 1; i + 1 < nLen; i += 2)
{
if (nData[i] > nData[i + 1]) //如果第一個數比第二個數大
{
if (nMax < nData[i]) //用第一個數與nMax比較
{
nMax = nData[i];
}
if (nMin > nData[i + 1]) //用第二個數與nMin比較。
{
nMin = nData[i + 1];
}
}
else //如果第一個數不大于第二個數
{
if (nMax < nData[i + 1]) //用第二個數與nMax比較
{
nMax = nData[i + 1];
}
if (nMin > nData[i]) //用第一個數與nMin比較
{
nMin = nData[i];
}
}
}
if (i < nLen) //確定是否都比較了,如果nLen為偶,可能最后一個數沒有比較
{
if (nMax < nData[i]) //比較最后一個數。
{
nMax = nData[i];
}
else if (nMin > nData[i])
{
nMin = nData[i];
}
}
*pnMax = nMax; //保存結果
*pnMin = nMin; //返回結果。
return 1;
};
//得到最小值
int GetMin(int nData[], int nLen)
{
int nMin = nData[0]; //初始化nMin為第一個數據
for (int i = 1; i < nLen; ++i) //遍歷數據一一同nMin比較
{
if (nMin > nData[i])
{
nMin = nData[i];
}
}
return nMin; //返回最小值
}
//得到最大值
int GetMax(int nData[], int nLen)
{
int nMax = nData[0]; //初始化nMax為第二個數據
for (int i = 1; i < nLen; ++i) //遍歷數據一一同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}; //測試
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;
}