今天学习了求最大最小数,这是一个很简单的算法,就是遍历一次,然后依次跟当前最大或最小的比较一下,遍历结束,则选择结束。
不过同时求最大最小的时候有点小技巧,就是我们两个两个的比较,把大个跟当前最大比较,小的跟当前最小的比较,这样就会节约一点比较时间,有原来的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;
}