標籤:
快速排序,應用到分治法。
下面先瞭解一下什麼是分治法?
分治法,顧名思義,分而治之。先將問題進行分解,然後將分離的問題進行求解,最後將所有分離的解進行合并,得到最終解。
分治法,“大事化小,小事化了,了後一合,大事得解”嗯哪,就是這樣。。。。
那麼瞭解了分治法以後,再來解決問題,歸併排序。(其實演算法中有那麼多排序一直搞不清楚,也分不清,他怎麼就叫這個名字,雖然知道了名字,但是還是不知道是怎樣解決問題的,怎麼解決這個問題呢?這是費解。。。。。還沒有想出來很好 的辦法來記住。只好先死記硬背了)
好了廢話不多說,進行分析求解。
SPARKS語言
procedure MERGESORT(low,high)
integer low,high;
if low<high
then mid<-(low+high)/2;//分割點
call MERGESORT(low,mid)//對前一部分進行排序
call MERGESORT(mid+1,high)//對後一部分進行排序
call MERGE(low,mid,high)//最後將已經排序好的進行合并。
endif
end MERGESORT
下面是合并的
procedure MERGE(low,mid,high)//合并就好像玩紙牌是一共兩副牌已排序,然後將兩副牌整合成一副牌的過程分別比較兩副牌的大小,放在另外一個位置最後在倒回原來的位置。
integer l,h,j,low,mid,high
global A(low,high);local B(low,high)
l<-low;h<-low;j<-mid+1
while h<=mid and j<=high do
if A(h)<A(j) then B(i)<-A(h);h<-h+1
else B(i)<-A(j);j<-j+1
endif
i<-i+1;
repeat
if h>mid then for k<-j to high do //如果其中一副牌已經完了,那麼另外剩餘的拍之間放到一副牌理即可
B(i)<-A(k);i<-i+1
repeat
else for k<-h to mid do
B(i)<-A(k);i<-i+1
repeat
endif
for k<-low to high do//倒到原來的位置
A(k)<-B(i)
repeat
end MERGE
演算法三之歸併排序