用分治法,二分求出数组的最大值和最小值

#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;


void PartionGet(int s,int e,int *meter,int *max,int *min);


int _tmain(int argc, _TCHAR* argv[])
{
//分治法,这里是使用的二分法来求出最大值和最小值
const int ArraySize = 50;
int a[ArraySize];
srand((unsigned)time(NULL));//用当前时间,设置种子 
for (int i = 0;i< ArraySize;i++)
{
a[i] = rand();
}


int max = INT_MIN; /* 用最小值初始化 */
int min = INT_MAX; /* 用最大值初始化 */
PartionGet(0,ArraySize - 1,a,&max,&min); /* 分治法获取最值 */
for (int i = 0;i< ArraySize;i++)
{
if (i % 6 == 0)
{
cout<<endl;
}
cout<<a[i]<<"   ";
}


cout<<endl;
cout<<"最大值:"<<max<<endl<<"最小值:"<<min<<endl;
getchar();
return 0;
}






/* 分治法获取最优解 */
void PartionGet(int s,int e,int *meter,int *max,int *min)
{
/* 参数:
* s 当前分治段的开始下标
* e 当前分治段的结束下标
* meter 数组的地址
* max 存储当前搜索到的最大值
* min 存储当前搜索到的最小值
*/
int i;
if(e-s <= 1)
{ /* 获取局部解,并更新全局解 */
if(meter[s] > meter[e])
{
if(meter[s] > *max)
*max = meter[s];
if(meter[e] < *min)
*min = meter[e];
}
else
{
if(meter[e] > *max)
*max = meter[e];
if(meter[s] < *min)
*min = meter[s];
}
return ;
}
i = s + (e-s)/2; /* 不是子问题继续分治,这里使用了二分,也可以是其它 */
PartionGet(s,i,meter,max,min);
PartionGet(i+1,e,meter,max,min);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值