1. 程式人生 > >演算法分析-最大連續子陣列(分治策略)

演算法分析-最大連續子陣列(分治策略)

大家好,我是三十三,第一次寫部落格,有什麼考慮不周的,請廣大同學多多指正。

作為一個計算機專業毛都不會的即將畢業狗,說實話,心裡一點有一絲絲慌慌的。在即將畢業之際,自己還是想囤點貨給自己貼貼金,有啥錯誤還望指出。

一、 實驗目的及任務

分治法求解最大子陣列問題

二、 實驗環境

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專業的學生,但是!你耐不住我菜啊。

哈哈哈哈哈