• 随手小代码——最大子数组 分治法


    =================================版权声明=================================

    版权声明:本文为博主原创文章 未经许可不得转载 

    请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

    未经作者授权勿用于学术性引用。

    未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

    本文不定期修正完善,为保证内容正确,建议移步原文处阅读。                                                               <--------总有一天我要自己做一个模板干掉这只土豆

    本文链接:http://www.cnblogs.com/wlsandwho/p/4710986.html

    耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

    =======================================================================

    多年来总算自己亲手写了一次。

    算法导论真是本好书。

    =======================================================================

    一直以为跨mid的部分会很难办,其实仔细看书亲手写过代码之后就会发现,也没啥。

    =======================================================================

    每个函数最后两个引用参数,是为了把最大的边界序号传回调用点。毕竟书上的是伪代码。

    =======================================================================

      1 #include "stdafx.h"
      2 #include <intsafe.h>
      3 #include <iostream>
      4 
      5 using namespace std;
      6 
      7 int FindMaxCrossingSubArraybyWLS(int nArray[],int nLeft,int nMid,int nRight,int& nMaxLeftIndex,int& nMaxRightIndex)
      8 {
      9     int nLeftSum=INT_MIN;
     10     int nRightSum=INT_MIN;
     11     int nSum=0;
     12 
     13     for (int i=nMid;i>=nLeft;--i)
     14     {
     15         nSum+=nArray[i];
     16 
     17         if (nSum>nLeftSum)
     18         {
     19             nLeftSum=nSum;
     20             nMaxLeftIndex=i;
     21         }
     22     }
     23 
     24     nSum=0;
     25     for (int i=nMid+1;i<=nRight;i++)
     26     {
     27         nSum+=nArray[i];
     28 
     29         if (nSum>nRightSum)
     30         {
     31             nRightSum=nSum;
     32             nMaxRightIndex=i;
     33         }
     34     }
     35 
     36     return nLeftSum+nRightSum;
     37 }
     38 
     39 int FindMaxSubArraybyWLS(int nArray[],int nLeft,int nRight,int& nMaxLeftIndex,int& nMaxRightIndex)
     40 {
     41     int nMaxSum=INT_MIN;
     42 
     43     if (nLeft==nRight)
     44     {
     45         nMaxLeftIndex=nLeft;
     46         nMaxRightIndex=nRight;
     47 
     48         nMaxSum=nArray[nLeft];
     49     }
     50     else
     51     {
     52         int nMid=(nLeft+nRight)/2;
     53 
     54         int nLefMaxLeftIndex=0;
     55         int nLeftMaxRightIndex=0;
     56         int nLeftMaxSubArraySum=FindMaxSubArraybyWLS(nArray,nLeft,nMid,nLefMaxLeftIndex,nLeftMaxRightIndex);
     57 
     58         int nRightMaxLeftIndex=0;
     59         int nRightMaxRightIndex=0;
     60         int nRightMaxSubArraySum=FindMaxSubArraybyWLS(nArray,nMid+1,nRight,nRightMaxLeftIndex,nRightMaxRightIndex);
     61 
     62         int nMidMaxLeftIndex=0;
     63         int nMidMaxRightIndex=0;
     64         int nMidMaxSubArraySum=FindMaxCrossingSubArraybyWLS(nArray,nLeft,nMid,nRight,nMidMaxLeftIndex,nMidMaxRightIndex);
     65 
     66         if (nLeftMaxSubArraySum>nMidMaxSubArraySum && nLeftMaxSubArraySum>nRightMaxSubArraySum)
     67         {
     68             nMaxSum=nLeftMaxSubArraySum;
     69 
     70             nMaxLeftIndex=nLefMaxLeftIndex;
     71             nMaxRightIndex=nLeftMaxRightIndex;
     72         }
     73         else
     74         if (nRightMaxSubArraySum>nLeftMaxSubArraySum && nRightMaxSubArraySum>nMidMaxSubArraySum)
     75         {
     76             nMaxSum=nRightMaxSubArraySum;
     77 
     78             nMaxLeftIndex=nRightMaxLeftIndex;
     79             nMaxRightIndex=nRightMaxRightIndex;
     80         }
     81         else
     82         {
     83             nMaxSum=nMidMaxSubArraySum;
     84 
     85             nMaxLeftIndex=nMidMaxLeftIndex;
     86             nMaxRightIndex=nMidMaxRightIndex;
     87         }
     88     }
     89 
     90     return nMaxSum;
     91 }
     92 
     93 int _tmain(int argc, _TCHAR* argv[])
     94 {
     95 // int nArr[7]={1,2,3,-1,4,-2,-3};
     96 //
     97 // int nMaxLeftIndex=0;
     98 // int nMaxRightIndex=0;
     99 // int nMaxSum=FindMaxCrossingSubArraybyWLS(nArr,0,3,6,nMaxLeftIndex,nMaxRightIndex);
    100 
    101     int nArr[16]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
    102 
    103     int nMaxLeftIndex=0;
    104     int nMaxRightIndex=0;
    105     int nMaxSum=FindMaxSubArraybyWLS(nArr,0,15,nMaxLeftIndex,nMaxRightIndex);
    106 
    107     cout<<"nArr["<<nMaxLeftIndex<<"..."<<nMaxRightIndex<<"] = "<<nMaxSum<<endl;
    108 
    109     return 0;
    110 }

    =======================================================================

    一直反对abcijklmnpq的命名,所以我一般只在循环里用i。

    =======================================================================

     千里黄云白日曛,北风吹雁雪纷纷。

  • 相关阅读:
    CSS盒模型
    js异步加载——defer和async的区别
    href和src的区别
    JS中Null与Undefined的区别
    浅谈Web Workers
    flex布局学习笔记
    Promise
    js数组类型检测
    JavaScript中的遍历
    Autocomplete
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4710986.html
Copyright © 2020-2023  润新知