找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1321|回复: 8

求一分治算法

[复制链接]
发表于 2009-11-3 02:51:24 | 显示全部楼层 |阅读模式 IP:江苏扬州
有一17个元素的整形数组
寻找最大元素和次大元素
发表于 2009-11-3 02:51:25 | 显示全部楼层 IP:江苏扬州
各位帮帮忙啊
回复

使用道具 举报

发表于 2009-11-3 02:51:26 | 显示全部楼层 IP:江苏扬州
先给它排序了,不就行了吗?
回复

使用道具 举报

发表于 2009-11-3 02:51:27 | 显示全部楼层 IP:江苏扬州
这是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();
}
回复

使用道具 举报

发表于 2009-11-3 02:51:28 | 显示全部楼层 IP:江苏扬州
可以用list类,然后再sort();就可以了
回复

使用道具 举报

发表于 2009-11-3 02:51:29 | 显示全部楼层 IP:江苏扬州
  1. #include <iostream>
  2. using namespace std;


  3. void findMaxAndSubMax(int *pi, int size, int * m, int *sm)
  4. {
  5. if(size == 2)
  6. {
  7. if(pi[0]>pi[1])
  8. {
  9. *m = pi[0];
  10. *sm = pi[1];
  11. return;
  12. }
  13. *m = pi[1];
  14. *sm = pi[0];
  15. return;
  16. }
  17. else if(size == 3)
  18. {
  19. if(pi[0]>pi[1] && pi[1]>pi[2])
  20. {
  21. *m = pi[0];
  22. *sm = pi[1];
  23. return;
  24. }
  25. else if(pi[0]>pi[2] && pi[2]>pi[1])
  26. {
  27. *m = pi[0];
  28. *sm = pi[2];
  29. return;
  30. }
  31. else if(pi[1]>pi[0] && pi[0]>pi[2])
  32. {
  33. *m = pi[1];
  34. *sm = pi[0];
  35. return;
  36. }
  37. else if(pi[1]>pi[2] && pi[2]>pi[0])
  38. {
  39. *m = pi[1];
  40. *sm = pi[2];
  41. return;
  42. }
  43. else if(pi[2]>pi[0] && pi[0]>pi[1])
  44. {
  45. *m = pi[2];
  46. *sm = pi[0];
  47. return;
  48. }
  49. else if(pi[2]>pi[1] && pi[1]>pi[0])
  50. {
  51. *m = pi[2];
  52. *sm = pi[1];
  53. return;
  54. }
  55. }
  56. else
  57. {
  58. int * m1 = new int;
  59. int * sm1 = new int;
  60. int * m2 = new int;
  61. int * sm2 = new int;

  62. int firstHalf = size/2;
  63. int secondHalf = size - firstHalf;

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

  66. int temp1, temp2;
  67. if(*m1 > *m2)
  68. {
  69. *m = *m1;
  70. temp1 = *m2;
  71. }
  72. else
  73. {
  74. *m = *m2;
  75. temp1 = *m1;
  76. }
  77. temp2 = (*sm1>*sm2)?*sm1:*sm2;
  78. *sm = (temp1>temp2)?temp1:temp2;

  79. delete m1;
  80. delete m2;
  81. delete sm1;
  82. delete sm2;
  83. return;
  84. }

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

  89. int max, sm;

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

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

  92. cout<<max<<endl;
  93. cout<<sm<<endl;


  94. return 0;
  95. }
复制代码
回复

使用道具 举报

发表于 2009-11-3 02:51:34 | 显示全部楼层 IP:江苏扬州
楼上大哥的程序看的我头都晕啦!
回复

使用道具 举报

发表于 2009-11-3 02:51:37 | 显示全部楼层 IP:江苏扬州
4楼和6楼都好复杂,只要排一下序不是就行了吗?
回复

使用道具 举报

发表于 2009-11-3 02:51:39 | 显示全部楼层 IP:江苏扬州
尽量利用语言已有的函数。
#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;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 11:39 , Processed in 0.194775 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表