該演算法核心思想:
任何連續最大子陣列必然處於以下三種情況:
子陣列完全落在中點左邊
子陣列完全落在中點右邊
子陣列橫跨中點
所以先求出左邊最大的子陣列,再找出右邊的,然後從中間找。比較大小即可。
中間點的最大子陣列容易確定,左右兩邊的無法確定,所以需要遞迴,把左右兩邊的陣列分解到只剩乙個元素時就能輕鬆確定。
class
maxrange
}
public maxrange findmaxmumsubarray(int array,int
left,int
right)
else
}
public maxrange findcrossmax(int array,int
left,int
mid,int
right)
}sum=max;
if (max<=0)
int maxrightindex=mid;
for (int i=maxrightindex+1;i<=right;i++)
}return new maxrange(max,maxleftindex,maxrightindex);
}
public static void main(string args)
for (int a:array)
system.out.println("------------");
system.out.println("");
maxrange maxrange=s.findmaxmumsubarray(array,0,array.length-1);
for (int i=maxrange.start;i<=maxrange.end;i++)
}執行結果:
246__-82__816__-193__-656__-834__865__645__------------
865__645__
555__755__657__117__-262__-158__-662__-514__------------
555__755__657__117__
851__-893__-882__-126__-850__806__-16__936__------------
806__-16__936__
最大子陣列的分治演算法
讀演算法導論當中的最大子陣列當中的分治演算法,涉及到的問題是怎麼從find max subarray 函式當中返回三個引數,所以用了vector來返回,總感覺不是太好,太浪費空間了,但也沒想到其他辦法。int max left,max right,sum int find max crossing ...
分治 最大子陣列
問題描述 給定乙個陣列,從中尋找最大子陣列 最大子陣列 子陣列內元素之和最大 顯然此問題僅在陣列中包含正負值下才有效,否則,最大子陣列是其本身。問題分析 設原陣列為a 0 len 1 子陣列中任意元素為b i 則i 1,i 2,0,i 1,i 2 len 1,皆有可能是子陣列內元素。因此我們可以將陣...
演算法導論 分治法 最大子陣列
題目描述 給定義陣列a,長度為n,找出陣列a中的最大子陣列,例如陣列a 則最大子陣列為。使用分治策略的求解方法 假定我們要尋找子陣列a low.high 的最大子陣列,使用分治法意味著我們要將子陣列劃分為兩個規模盡可能相等的子陣列。也就是說,找到子陣列的 位置,比如mid,然後求解兩個子陣列a lo...