分治法寻找数组最大的两个数和最小的两个数

分治法寻找数组最大的两个数和最小的两个数

这个程序实现的结果:假如有两个并列最大或并列最小数,他们两个是有可能一起作为最大和次大(最小和次小)。所以,应该尽量保证没有相同大小的数据。但程序对相同的数据不是返回同一个下标的数,而是不同下标的数据

本程序旨在练习分治法,其他的请参看最大和最小值的求法。

 1 #include<stdio.h>
 2 #include<time.h>
 3 #include<stdlib.h>
 4 int maxMin2(int *a,int i,int j,int *max1,int *max2,int *min1,int *min2);
 5 int max(int a,int b);
 6 int min(int a,int b);
 7 int  main()
 8 {
 9     int *a;
10     int i,n;
11     int max1,max2,min1,min2;
12     
13     scanf("%d",&n);
14     a=(int *)malloc(sizeof(int)*n);
15     srand((unsigned int)time(0));
16     for(i=0;i<n;i++) a[i]=rand()%91+10;
17     for(i=0;i<n;i++)
18     {
19         printf("%d ",a[i]);
20         if((i+1)%5==0) printf("\n");
21     }
22     printf("\n\n");
23     maxMin2(a,0,n-1,&max1,&max2,&min1,&min2);
24     printf("%d %d\n%d %d\n",max1,max2,min1,min2);/**/
25     return 0;
26 }
27 int maxMin2(int *a,int i,int j,int *max1,int *max2,int *min1,int *min2)
28 {
29     int mid,t;
30     int lmax1,lmax2,lmin1,lmin2,rmax1,rmax2,rmin1,rmin2;
31     if(j-i==2) 
32     {
33         *max1=max(a[j],max(a[i],a[i+1]));
34         *min1=min(a[j],min(a[i],a[i+1]));
35         t=a[i]+a[j]+a[i+1];
36         *max2=t-*max1-*min1;
37         *min2=*max2;
38         return 0;
39     }
40     else if(j-i==1)
41     {
42         if(a[i]>a[j]){*max1=a[i];*max2=a[j]; *min1=a[j];*min2=a[i];return 0;}
43         else{*max1=a[j];*max2=a[i]; *min1=a[i];*min2=a[j];return 0;}
44     }
45     else
46     {
47         mid=i+(j-i)/2;
48         maxMin2(a,i,mid,&lmax1,&lmax2,&lmin1,&lmin2);
49         maxMin2(a,mid+1,j,&rmax1,&rmax2,&rmin1,&rmin2);
50         if(lmax1>rmax1)
51         {
52             *max1=lmax1;
53             if(lmax2>rmax1) *max2=lmax2;
54             else *max2=rmax1;
55         }
56         else
57         {
58             *max1=rmax1;
59             if(lmax1>rmax2) *max2=lmax1;
60             else *max2=rmax2;
61         }
62         if(lmin1<rmin1)
63         {
64             *min1=lmin1;
65             if(lmin2<rmin1) *min2=lmin2;
66             else *min2=rmin1;
67         }
68         else
69         {
70             *min1=rmin1;
71             if(lmin1<rmin2) *min2=lmin1;
72             else *min2=rmin2;
73         }
74     }
75     return 0;
76 }
77 int max(int a,int b)
78 {    return a>b?a:b;       }
79 int min(int a,int b)
80 {    return a<b?a:b;       }
View Code

转载于:https://www.cnblogs.com/huashanqingzhu/p/3853554.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、本书的内容 目前,市面上有关计算机算的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算、平摊分析等),重点在于算的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算的作用、概率分析和随机化算、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方。 本书以相当的深度介绍了许多常用的数据结构和有效的算。编写上采用了“五个一”,即一章介绍一个算、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算均以通俗易懂的语言进行说明,并采用了大量插图来说明算是如何工作的,易于理解。 4.算的“伪代码”形式简明实用。 书中的算均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算设计的效率,对所有的算进行了仔细、精确的运行时间分析,有利于进一步改进算。 三、本书的用 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算研究的一个全面、综合性的介绍。书中给出了多个算,并对它们进行了较为深入的分析,使得这些算的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算、一种算设计技术、一个应用领域或一个相关的主题。算是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算的工作过程。我们强调将算的效率作为一种设计标准,对书中的所有算,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算或数据结构课程使用。因为书中讨论了算设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值