這個遞歸過程怎么解?


請問高手合並排序,這個是遞歸的,但是搞不懂它的來龍去脈,為什么這么寫就可以實現合並排序呢?


void mergesort(int a[],int l,int r)
{
int m=(r+l)/2;
if(r<=l)
return;
mergesort(a,l,m);
  mergesort(a,m+1,r);
         printf("Now the sort result is:\n");

merge(a,l,m,r);
    
}

10 个解决方案

#1


你要用遞歸,假設的思想去思考這個問題,
就是一定要站在一個基礎上
這個基礎就是:假設:mergesort(a,l,r) 能排序a數組中的元素,
那么 分治法把原來分成兩個子問題,排序[a,l,m],[a,m+1,r]
既然  子問題已經解決
再把 子問題合並就能得出原來大問題的解了

#2


飄過

#3


那要弄懂他是只要體會他這個思想就好,還是要搞一個實例,自己試試過程是怎樣的呢?
類似這個遞歸感覺要是按他的過程來一步一步寫下來,要花很多時間和很費力氣,是不是只要記住他的思想就行了?

#4


遞歸的本質是數學歸納法,分為基礎條件和假設,歸納三步。
基礎是:只有一個元素時是有序的
假設是:mergesort(a,l,r) 能排序a數組[l,r]范圍中的元素
歸納是:merge(a,l,m,r);  能把兩個有序的范圍合成一個全體有序的范圍
這個典型的分治法,可以參考wikipedia:  http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm

#5


只有這段程序是實現不了合並排序的,大哥。

這個merge() 函數,才是最難寫的,我以前寫過的。

你這個mergesort()只是把一個數組,不斷分成1/2 ,然后對每個1/2再進行合並排序。

然后排完序的兩個1/2 子數組,還必須合並成一個數組,這就是merge()的工作了。

#6


merge需要一個歸並算法。
這個很簡單
merge(int a[],int l,int m,int r)
{
int b[r-l]
int i=l
int j=m
int k=0
re:
if (a[i]<=a[j])
{
b[k]=a[i];
i++
else
{
b[k]=a[j];
j++
}
k++
if (k<r-l)
goto re
for (i=0,i<r-l,i++)
a[i+l]=b[i]
}

事實上分治法的“分”很簡單,但是“合”的算法卻是最關鍵的

#7


這不是分治法 + 遞歸嗎
先在中間分開,然后依次排序前半段和后半段。
在分段和排序的同時,又依次在中間分開然后遞歸下去
直到 最后一個元素。

#8


引用 4 樓 zhangbiao1981 的回復:
遞歸的本質是數學歸納法,分為基礎條件和假設,歸納三步。
基礎是:只有一個元素時是有序的
假設是:mergesort(a,l,r) 能排序a數組[l,r]范圍中的元素
歸納是:merge(a,l,m,r);  能把兩個有序的范圍合成一個全體有序的范圍
這個典型的分治法,可以參考wikipedia:http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm

遞歸的本質是數學歸納法,學習了,不過感覺下面的假設和歸納有問題。整理下思路
    數學歸納法的核心在於,假設對公式S(n)當n=k時成立,則能邏輯的推出n=k+1時,公式S(n)也是成立的。
這里S(k)是否成立並不知道,但由上面我們能夠得知,如果S(k-1)能成立則S(k)就肯定成立,但S(k-1)是否成立也是不知道的,不過仍能依次向上假設,假設到S(k-m)成立時,這里如果k-m=1,則這個假設是正確的,從而就能夠再逐次論證回去。
    對於歸並排序問題,前提假設應該是如果兩個數組[1,m],[m+1,r]是有序數組,那么我們能用一個合並方法merge(a,l,m,r)把這兩個數組合並為一個有序數組,這兩個數組是否有序是不知道的,但是我們可以把每個數組一分為二,然后假如分開的兩個數組是有序的,用我們的合並方法得到的數組肯定也是有序的,在不知道分開的兩個數組是否有序的情況下,我們就必須一直分下去,當分解到兩個數組每個不多於一個元素的情況下,這時這兩個子數組肯定是有序的,此時把兩個子數組用合並方法得到的合集必然有序。再逐次遞推回去,則最終的合集數組[1,r]必將有序。

#9


找本算法設計的書看看吧,

#10


學習up

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com