歸併排序理解遞迴
阿新 • • 發佈:2018-11-19
https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
先上一個網站,這個網站一定要看。
點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。
你可以看到圖裡面的數分了四層,然後變成八個數,但是每兩個數是一個遞迴裡面的,所以先從第一個和第二個數開始歸併,歸併的時候比較大小,歸併完之後,這是這個小遞迴的結束,然後這層總共有四個小遞迴,依次執行完即可。
然後才是第三層遞迴的執行,因為已經分過了,所以只執行歸併,然後再去執行之前的遞迴。
#include <iostream> using namespace std; int a[10]={13,17,15,20,22,23,30,28,40,10}; int b[10]; void Merge(int a[],int s,int m,int e,int tmp[]) { int pb=0; int p1=s; int p2=m+1; while (p1<=m&&p2<=e) { if (a[p1]>a[p2]) { tmp[pb++]=a[p2++]; } else { tmp[pb++]=a[p1++]; } } while (p1<=m) { tmp[pb++]=a[p1++]; } while (p2<=e) { tmp[pb++]=a[p2++]; } for (int i=0;i<e-s+1;i++) { a[s+i]=tmp[i]; } } void MergeSort(int a[],int s,int e,int tmp[]) { if (s<e) { int mid=s+(e-s)/2; MergeSort(a,s,mid,tmp); MergeSort(a,mid+1,e,tmp); Merge(a,s,mid,e,tmp); } } int main() { int size=sizeof(a)/sizeof(int); MergeSort(a,0,size-1,b); for (int i=0;i<size;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; }