解法一:
扫描一次数组找出最大值;
再扫描一次数组找出最小值。
代码(略)
比较次数2N-2
解法二:
将数组中相邻的两个数分在一组, 每次比较两个相邻的数,将较大值交换至这两个数的左边,较小值放于右边。
对大者组扫描一次找出最大值,对小者组扫描一次找出最小值。
代码(略)
比较1.5N-2次,但需要改变数组结构
解法三:
每次比较相邻两个数,较大者与MAX比较,较小者与MIN比较,找出最大值和最小值。
代码如下:
void GetMaxAndMin(int* arr, int len, Result* rlt)
{
for(int i=2; i< len-1; i=i+2)
{
if(NULL==arr[i+1])
{
if(arr[i]>rlt->Max)
rlt->Max=arr[i];
if(arr[i]<rlt->Min)
rlt->Min=arr[i];
}
if(arr[i]>arr[i+1])
{
if(arr[i]>rlt->Max)
rlt->Max=arr[i];
if(arr[i+1]<rlt->Min)
rlt->Min=arr[i+1];
}
if(arr[i]<arr[i+1])
{
if(arr[i+1]>rlt->Max)
rlt->Max=arr[i+1];
if(arr[i]<rlt->Min)
rlt->Min=arr[i];
}
}
}
比较次数1.5N-2,但是不用改变原数组结构。
解法四:
分治法,算出前N/2个数的MAX和MIN,再算出后N/2个数的MAX和MIN。代码如下:
void GetMaxAndMin1(int* arr, int len, Result* rlt)
{
if(len==0||!arr)
return;
if(len==1)
{
if(arr[0]>rlt->Max)
rlt->Max=arr[0];
if(arr[0]<rlt->Min)
rlt->Min=arr[0];
return;
}
GetMaxAndMin(arr, len/2, rlt);
GetMaxAndMin(&arr[len/2], len-len/2, rlt);
}
需比较1.5/N-2次。
试验代码:
#include "stdio.h"
#include "stdlib.h"
#define LEN(arr) sizeof(arr)/sizeof((arr)[0])
struct Result{
int Max;
int Min;
};
int main()
{
int test[10]={3,2,4,1,5,2,7,9,0};
Result* rlt = (Result*)malloc(sizeof(Result));
rlt->Max = rlt->Min = test[0];
int len=LEN(test);
GetMaxAndMin(test, len, rlt);
printf("Max=%d\nMin=%d\n", rlt->Max, rlt->Min);
getchar();
}