C語言實現分治法

2021-08-28 08:46:58 字數 1083 閱讀 8763

我用了大約三種方法實現,逐漸減少時間複雜度,分別用不同的命名 方式來區分他們,順便列印了那個子區間的和值最大,

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...