分治法例項 來自 演算法 C語言實現

2021-08-22 17:57:58 字數 1472 閱讀 5856

使用分治法求最大值

這個函式將陣列a[l]...a[r]分成a[l],...,a[m]和a[m+1],...a[r]兩部分,分別求出每一部分的最大元素(遞迴地),並返回較大的那乙個作為整個陣列的最大元素.如果陣列大小是偶數,則兩部分大小相等;如果是奇數,第一部分比第二部分的大小大1.

#include #include #include #include using namespace std;

#define ok 1

#define error -1

#define true 1

#define false 0

typedef int status;

int max(int a, int l, int r)

int main()

; int maxx = max(a, 0, 6);

printf("%d\n", maxx);

return 0;

}

漢諾塔的解

我們把盤子(遞迴地)移動到c上的方案是,將除了最下面的盤子之外的所有盤子移到b上,然後將做下面的盤子移到c上,然後(遞迴地)再將其他盤子移回到最下面的盤子上面.

#include #include #include #include using namespace std;

#define ok 1

#define error -1

#define true 1

#define false 0

typedef int status;

//輸出盤子的移動

void shift(int n, char x, char y)

void hanoi(int n, char a, char b, char c)

//以c為中間軸,將a上的盤子移動到b上

hanoi(n-1, a, c, b);

shift(n, a, c);

//以a為中間軸,將b上的盤子移動到c上

hanoi(n-1, b, a, c);

}int main()

使用分治法在尺子上畫刻度

要在尺子上畫刻度線,我們首先在左半邊畫刻度線,然後在中間畫一條最長的刻度線,最後在右半邊畫刻度線.

#include #include #include #include using namespace std;

#define ok 1

#define error -1

#define true 1

#define false 0

typedef int status;

//畫線

void mark(int m, int h)

//劃分該區域內的刻度

void rule(int l, int r, int h)

}int main()

C語言實現分治法

我用了大約三種方法實現,逐漸減少時間複雜度,分別用不同的命名 方式來區分他們,順便列印了那個子區間的和值最大,maxsum 1 用陣列的方式實現三次遍歷,求出所有子串行的和值,並且比較大小,求出最大子串行值 maxsum 2 用另乙個陣列來儲存從下標0開始的所有和值,然後操作次此序列,用減的方式,來...

埃拉託色尼篩法 來自 演算法 C語言實現

這個程式的功能是 如果自然數i是素數,則設a i 為1,否則設為0.首先把陣列中的所有元素設為1,否則設為0.首先把陣列中的所有元素設為1,已表明沒有任何數以被證明是非素數.然後,把陣列中所對應索引處已證明是非素數 已知素數的倍數 的元素設為0.如果所有更小素數的倍數都已設為0,a i 仍為1,則可...

C語言實現快速排序法(分治法)

分治法的基本思想 將原問題分解為若干個更小的與原問題相似的問題,然後遞迴解決各個子問題,最後再將各個子問題的解組合成原問題的解。利用分治法可以將解決辦法分為 三步走 戰略 1 在資料集中選定乙個元素作為 基準 pivot 2 將所有資料集小於基準的元素放在基準左邊,大於基準的元素放在基準右邊,把原資...