| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1076 人关注过本帖
标题:求一分治算法
只看楼主 加入收藏
ooooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2005-6-24
收藏
 问题点数:0 回复次数:11 
求一分治算法

有一17个元素的整形数组
寻找最大元素和次大元素

搜索更多相关主题的帖子: 算法 分治 
2006-05-28 16:25
ooooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2005-6-24
收藏
得分:0 
各位帮帮忙啊

2006-05-28 16:26
freshman42
Rank: 1
等 级:新手上路
威 望:1
帖 子:94
专家分:0
注 册:2005-12-4
收藏
得分:0 

先给它排序了,不就行了吗?

[此贴子已经被作者于2006-5-28 16:32:18编辑过]


2006-05-28 16:32
ooooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2005-6-24
收藏
得分:0 
这是soft_wind提供的递归算法

#include "stdio.h"
#include "conio.h"
void maxmin(int a[],int n,int *max,int *min)
{
int a1[5],a2[5];
int i,j,k=0;
int max1,max2,min1,min2;
if(n==1)
*max=*min=a[0];
else if(n==2)
{
if(a[0]>a[1])
{
*max=a[0];
*min=a[1];
}
else
{
*max=a[1];
*min=a[0];
}
}
else
{
for(i=0;i<n/2;i++)
a1[i]=a[i];
for(j=i;j<n;j++)
a2[k++]=a[j];
maxmin(a1,n/2,&max1,&min1);
maxmin(a2,(n-n/2),&max2,&min2);
if (max1 > max2)
*max = max1;
else
*max = max2;
if (min1 > min2)
*min = min2;
else
*min = min1;
}

}
main()
{
int a[10]={1,12,21,4,57,78,95,43,100,23};
int max,min;
maxmin(a,10,&max,&min);
printf("%d %d",max,min);
getch();
}


2006-05-29 22:23
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
可以用list类,然后再sort();就可以了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-29 22:30
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
[CODE]#include <iostream>
using namespace std;


void findMaxAndSubMax(int *pi, int size, int * m, int *sm)
{
if(size == 2)
{
if(pi[0]>pi[1])
{
*m = pi[0];
*sm = pi[1];
return;
}
*m = pi[1];
*sm = pi[0];
return;
}
else if(size == 3)
{
if(pi[0]>pi[1] && pi[1]>pi[2])
{
*m = pi[0];
*sm = pi[1];
return;
}
else if(pi[0]>pi[2] && pi[2]>pi[1])
{
*m = pi[0];
*sm = pi[2];
return;
}
else if(pi[1]>pi[0] && pi[0]>pi[2])
{
*m = pi[1];
*sm = pi[0];
return;
}
else if(pi[1]>pi[2] && pi[2]>pi[0])
{
*m = pi[1];
*sm = pi[2];
return;
}
else if(pi[2]>pi[0] && pi[0]>pi[1])
{
*m = pi[2];
*sm = pi[0];
return;
}
else if(pi[2]>pi[1] && pi[1]>pi[0])
{
*m = pi[2];
*sm = pi[1];
return;
}
}
else
{
int * m1 = new int;
int * sm1 = new int;
int * m2 = new int;
int * sm2 = new int;

int firstHalf = size/2;
int secondHalf = size - firstHalf;

findMaxAndSubMax(pi, firstHalf, m1, sm1);
findMaxAndSubMax(pi+firstHalf, secondHalf, m2, sm2);

int temp1, temp2;
if(*m1 > *m2)
{
*m = *m1;
temp1 = *m2;
}
else
{
*m = *m2;
temp1 = *m1;
}
temp2 = (*sm1>*sm2)?*sm1:*sm2;
*sm = (temp1>temp2)?temp1:temp2;

delete m1;
delete m2;
delete sm1;
delete sm2;
return;
}

}
int main()
{
int nums[] = {2, 3, 12, 108, 19, 34, 6, 7, 37, 28, 65, 26, 31, 68, 20, 5, 99};

int max, sm;

int size = sizeof(nums) / sizeof(int);

findMaxAndSubMax(nums, size, &max, &sm);

cout<<max<<endl;
cout<<sm<<endl;


return 0;
}[/CODE]

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-05-30 10:19
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
收藏
得分:0 

楼上大哥的程序看的我头都晕啦!

奋斗改变一切!!
2006-05-30 20:24
无限忧伤
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-4-5
收藏
得分:0 
4楼和6楼都好复杂,只要排一下序不是就行了吗?

2006-05-30 21:30
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 

尽量利用语言已有的函数。
#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{
int intar[] = {5,8,2,6,4,3,11,10,9,7}, intSize = sizeof(intar)/sizeof(int);
sort(&intar[0], &intar[intSize]);
cout << intar[intSize-1] << " " << intar[intSize-2] << endl;
return 0;
}


http://myajax95./
2006-06-01 10:42
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

觉得如果还不是很熟练算法思想的时候就多练习不用现有的排序函数,锻炼思维,但是如果掌握以后直接用algorithm或则stl可以简单解决问题,多好~!


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-01 12:37
快速回复:求一分治算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027369 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved