分治算法——入门简单实例

  求最大值和最小值,相信再简单不过了,只要一个循环遍历,然后每次比较最大的和最小的值,然后遍历完后就得到了最大值和最小值了。

就是先排序,然后最大值和最小值就是头尾了。

      这里用分治法来求最大值和最小值了。代码如下:

  1. #include <stdio.h>  
  2.    
  3. int aa[] = {1, 5, 0, -8, 4, 2};  
  4.    
  5. void get_max_min(int *s, int *nmax, int * nmin, int left, int right)  
  6. {  
  7.               int max1, max2;  
  8.               int min1, min2;  
  9.               int mid;  
  10.                 
  11.               if(left == right)      //最小的子问题就一个数,那么最大值和最小值都是其本身  
  12.               {  
  13.                              *nmax = *nmin = s[left];         
  14.                              return ;                    
  15.               }  
  16.               else if(left == (right - 1)) //最小的子问题是两个数,那么比较得出其最大最小值。  
  17.               {  
  18.                              max1 = s[left];  
  19.                              max2 = s[right];  
  20.                              *nmax = max1 > max2 ? max1 : max2;  
  21.                              *nmin = max1 < max2 ? max1 : max2;  
  22.                              return ;  
  23.               }  
  24.               else   //否则,子问题还不够小,那么继续分治  
  25.               {  
  26.                              mid = (left + right) / 2;  
  27.                              get_max_min(s, &max1, &min1, left, mid);  
  28.                              get_max_min(s, &max2, &min2, mid+1, right);  
  29.                             *nmax = max1 > max2 ? max1 : max2;               //子问题的解合并求最大值和最小值  
  30.                              *nmin = min1 < min2 ? min1 : min2;                    
  31.                              return ;  
  32.               }  
  33. }  
  34.    
  35. int main()  
  36. {  
  37.               int max, min;  
  38.                
  39.               get_max_min(aa, &max, &min, 0, 5);     
  40.                 
  41.               printf("max: %d\n", max);       
  42.               printf("min: %d\n", min);  
  43.                 
  44.               return 0;  
  45. }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值