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

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

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

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

复制代码
 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
复制代码

posted on   华山青竹  阅读(2020)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示