我用了大約三種方法實現,逐漸減少時間複雜度,分別用不同的命名 方式來區分他們,順便列印了那個子區間的和值最大,
maxsum_1:用陣列的方式實現三次遍歷,求出所有子串行的和值,並且比較大小,求出最大子串行值
maxsum_2:用另乙個陣列來儲存從下標0開始的所有和值,然後操作次此序列,用減的方式,來算出所有和值,並且比較大小然後,改變區間
maxsum_3: 採用分治法,用遞迴的方式,把序列分為三種情況,左序列存在和值最大,有序列存在和值最大,中間存在和值最大,然後兩個中間和值相加,就是中間最大和值,然後這三種情況比較大小,得出最大子串行和值和區間。
#includeint max, mi, mj;//定義為全域性變數不用來回傳
//複雜度為o(n^3)
void maxsum_1(int a, int n)
} }}//o(n^2+n)
void maxsum_2(int a,int s,int n)
} }}//分治法 o(log2^n)
int maxsum_3(int a, int left, int right)
} //中間部分,從左邊開始++
int m2 = 0, rightsum = 0;
for (i = mid + 1; i <= right; i++)
}sum = m1 + m2;
if (sum < leftmaxsum)
sum = leftmaxsum;
if (sum < rightmaxsum)
sum = rightmaxsum;
} return sum;
}//o(n^)
int main(void) ;
int s[8] = ;
max = a[0];
mi = mj = 0;
// maxsum_1(a, 7);
// maxsum_2(a, s, 7);
max=maxsum_3(a,0,6);
printf(" mi=%d,mj=%d,max=%5d",mi,mj,max);
return 0;
}
C語言實現快速排序法(分治法)
分治法的基本思想 將原問題分解為若干個更小的與原問題相似的問題,然後遞迴解決各個子問題,最後再將各個子問題的解組合成原問題的解。利用分治法可以將解決辦法分為 三步走 戰略 1 在資料集中選定乙個元素作為 基準 pivot 2 將所有資料集小於基準的元素放在基準左邊,大於基準的元素放在基準右邊,把原資...
分治法例項 來自 演算法 C語言實現
使用分治法求最大值 這個函式將陣列a l a r 分成a l a m 和a m 1 a r 兩部分,分別求出每一部分的最大元素 遞迴地 並返回較大的那乙個作為整個陣列的最大元素.如果陣列大小是偶數,則兩部分大小相等 如果是奇數,第一部分比第二部分的大小大1.include include inclu...
C語言分治法實現歸併排序
歸併排序的基本思想 將兩個及其以上的有序表合併為一張有序表,把待排序序列通過分治法分為若干個有序子串行,然後每兩個子串行合併為乙個子串行,經過多次合併後集成為一張有序表。排序過程如圖 如下 include stdio.h define max 100 int is1 max is2 max 原陣列i...