演算法分析-最大連續子陣列(分治策略)
阿新 • • 發佈:2019-01-25
大家好,我是三十三,第一次寫部落格,有什麼考慮不周的,請廣大同學多多指正。
作為一個計算機專業毛都不會的即將畢業狗,說實話,心裡一點有一絲絲慌慌的。在即將畢業之際,自己還是想囤點貨給自己貼貼金,有啥錯誤還望指出。
一、 實驗目的及任務
分治法求解最大子陣列問題
二、 實驗環境
c++或java或Turbo c
三、 問題描述
Input : 一個數組
Output:最大連續子陣列。
四、 程式設計任務
一個整數陣列中的元素有正有負,在該陣列中找出一個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。
五、 資料輸入
隨機產生1000以上的資料(有正有負),放入輸入檔案input.txt
六、 結果輸出
比如陣列{2,4,-7,5,2,-1,2,-4,3}的最大連續子陣列為{5,2,-1,2},最大連續子陣列的和為5+2-1+2=8。
七、 實驗程式碼
public class Main { /** * @author 三十三 */ public int[] fen(int[] a,int s,int e,String loc){ if(s==e){ int[] end1 = new int[]{a[s],s,s}; return end1; } int mid = (s+e)/2; int[] l_list = fen(a,s,mid,"左"); int l_sum = l_list[0]; int[] r_list = fen(a,mid+1,e,"右"); int r_sum = r_list[0]; int[] mid_list = midMax(a, s, mid, e); int mid_sum = mid_list[0]; System.out.println(l_sum+" "+r_sum+" "+mid_sum+" "+loc); if(l_sum>r_sum&&l_sum>mid_sum){ return l_list; }else if(r_sum>l_sum&&r_sum>mid_sum){ int[] endr = new int[]{r_sum,mid+1,e}; return r_list; }else{ return mid_list; } } public int[] midMax(int[] a,int s,int m,int e){ int sum = 0; int l = 0; int r = 0; //System.out.println(s+" "+m+" "+e); int left_sum = a[m]; l = m; for(int i = m;i>=s;i--){ sum += a[i]; if(sum > left_sum){ l = i; left_sum = sum; } } sum = 0; int right_sum = a[m+1]; r = m+1; for(int i = m+1; i<=e;i++){ sum += a[i]; if(sum > right_sum){ r = i; right_sum = sum; } } int[] end = new int[]{left_sum+right_sum,l,r}; return end; } }
注:
把程式碼貼上之後才發現,自己程式碼水平果真拿不出手,雖然我是一個cs專業的學生,但是!你耐不住我菜啊。
哈哈哈哈哈