Esempio n. 1
0
        /// <summary>
        ///
        /// O(nlogn)
        /// </summary>
        /// <param name="low"></param>
        /// <param name="high"></param>
        /// <param name="array"></param>
        /// <returns></returns>
        static SubArrResult RecursiveMerge(int low, int high, int[] array)
        {
            SubArrResult result = new SubArrResult();

            if (low == high)
            {
                result.startIndex = low;
                result.endIndex   = high;
                result.totalSum   = array[low];

                return(result);
            }

            int mid = (low + high) / 2;

            //三种情况
            //最大子数组位于左侧 [i, mid]
            //最大子数组位于右侧 [mid, j]
            //最大子数组起始于左侧结束于右侧 [i, j]

            SubArrResult resultLeft  = RecursiveMerge(low, mid, array);         //递归左半部分
            SubArrResult resultRight = RecursiveMerge(mid + 1, high, array);    //递归右半部分
            SubArrResult resultMid   = MidArraySum(low, mid, high, array);      //计算此层的和(并不是最大中间子序列,问题已经化解为三部分找最大部分)

            if (resultLeft.totalSum >= resultRight.totalSum && resultLeft.totalSum >= resultMid.totalSum)
            {
                return(resultLeft);
            }
            else if (resultRight.totalSum >= resultLeft.totalSum && resultRight.totalSum >= resultMid.totalSum)
            {
                return(resultRight);
            }
            else
            {
                return(resultMid);
            }

            //return result;
        }