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


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

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

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

     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("
    ");
    21     }
    22     printf("
    
    ");
    23     maxMin2(a,0,n-1,&max1,&max2,&min1,&min2);
    24     printf("%d %d
    %d %d
    ",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
  • 相关阅读:
    gcc编译器遇到的部分问题的总结(二)
    gcc编译器遇到的部分问题的总结
    Illegal instruction与march编译选项
    使用using与typedef来定义别名
    C++模板学习之递归
    C++模板学习之typename
    简单的listen+fork accept服务器实现
    一个简单的日志类的开发
    linux中的select和epoll模型
    程序异常退出调试(二)
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3853554.html
Copyright © 2020-2023  润新知