我的演算法筆記(5)分治(1)

2021-09-21 07:17:24 字數 2964 閱讀 8600

;//乙個臨時陣列

intmin

(int x,

int y)

void

merge

(int a,

int s,

int m,

int e,

int b)

//只要有乙個陣列的數全部都排完了,那麼我就可以吧另乙個陣列剩下的全部數就都放在臨時陣列裡了

while

(x1 <=m)

b[x++

]= a[x1++];

while

(x2<=e)

b[x++

]= a[x2++];

for(i=

0;i1;i++

)//這裡e-s+1是因為e是從len-1開始的,所以+1

a[s+i]

= b[i]

;//把b中已經排好的陣列重新賦值給a

}void

mergesort

(int a,

int s,

int e,

int b)

//乙個引數是要排序的陣列,另乙個是陣列的開始,結尾,b臨時存放

}//寫乙個演義的函式

void

display

(int a,

int s,

int e)

intmain()

結果如圖所示:

從**中我們可以看出,我們使用了遞迴的思想完成了歸併排序的操作,其中比較重要的倆格步驟,就是「分(mergesort)」和「和(merge)」倆個函式

在mergesort函式中:

void

mergesort

(int a,

int s,

int e,

int b)

//乙個引數是要排序的陣列,另乙個是陣列的開始,結尾,b臨時存放

}

主要是進行了分半的操作,通過二分的過程,把乙個大的陣列變成乙個個小的區域性的陣列,然後再通過merge函式,分別對每一小片的陣列再次整理組合在了一起.

void

merge

(int a,

int s,

int m,

int e,

int b)

//只要有乙個陣列的數全部都排完了,那麼我就可以吧另乙個陣列剩下的全部數就都放在臨時陣列裡了

while

(x1 <=m)

b[x++

]= a[x1++];

while

(x2<=e)

b[x++

]= a[x2++];

for(i=

0;i1;i++

)//這裡e-s+1是因為e是從len-1開始的,所以+1

a[s+i]

= b[i]

;//把b中已經排好的陣列重新賦值給a

此處出處:五分鐘學演算法

//quicksort

#include

#define buf_size 10

void

display

(int array,

int maxlen)

printf

("\n");

}void

swap

(int

*a,int

*b)// the implementation of quicksort

void

quicksort

(int array,

int begin,

int end)

//此時就已經處理完成了陣列,

//進行k左右倆邊陣列的分別排序

quicksort

(array,begin,i-1)

;quicksort

(array,i+

1,end);}

main()

;int maxlen = buf_size;

printf

("排序前的陣列:\n");

display

(array,maxlen)

;quicksort

(array,

0,maxlen-1)

;// 快速排序

printf

("排序後的陣列:\n");

display

(array,maxlen)

;}

結果如圖所示:

在給出的快排**中,我是讓a[0]先作為k,然後開始比較。

**解讀:

void

quicksort

(int array,

int begin,

int end)

//此時就已經處理完成了陣列,

//進行k左右倆邊陣列的分別排序

quicksort

(array,begin,i-1)

;quicksort

(array,i+

1,end)

;}

演算法02 分治

分治,就是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。分治法常常跟遞迴一起使用,借助遞迴,我們可以方便地將問題分解再將結果合併。分解 將原問題分解為若干個規模較小,相互獨立,與原問題形式相同的子問題 遞迴 若子問...

演算法複習筆記(三)分治法

演算法複習筆記 三 分治法 分治法劃分對策 子問題與原問題相比 問題性質一致,問題規模不同 求解一般分為三個階段 1.劃分 直到問題足夠小可以直接求解為止 2.求解 3.合併 將子問題的解合併為乙個更大規模的問題的解,自底向上逐步求出原問題的解。我們給出下面這個理智引入分治技術 不是所有的分治法都比...

作業5 分治演算法之最近對問題

最近對問題 令p為笛卡爾平面上n 1個點構成的集合。簡單起見,假設集合中每個點都不一樣。我們還假設這些點是按照其x周座標公升序排列的。為了更加方便,我們還按照點的y軸座標在另乙個列表中進行公升序排列,分別記為px,py。當2 n 3時,通過蠻力求解出d。當n 3時,可以利用點集在方向上的中位數mid...