/// <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; }