寻找数组中最大值和最小值

时间:2023-01-13 14:45:37

解法一:

扫描一次数组找出最大值;

再扫描一次数组找出最小值。

代码(略) 

比较次数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();
}