排序專題之歸併排序

2021-07-04 11:24:05 字數 870 閱讀 5821

歸併排序:

基本思想是將兩個或兩個以上有序表合併成乙個新的有序表。

假設初始序列含有n個記錄,首先將這n個記錄看成n個有序的子串行,

每個子串行的長度為1,然後兩兩歸併,得到?n/2?個長度為2(n為奇數時,

最後乙個序列的長度為1)的有序子串行;在此基礎上,再進行兩兩歸併,

如此重複,直至得到乙個長度為n的有序序列為止。這種方法被稱作2-路歸併排序。 

下面請看**實現:

**一:

void mergesort(record s,record a,int left,int right)

else charu(&a[left],right-left+1);//若序列短的 直接用插入排序

} void guibing(record s,record a,int left,int right,int middle)

for(j=1;j<=right-middle;j++)

for(t1=left,t2=right,k=left;k<=right;k++)

else s[k]=a[t2--]; }

}

歸併排序中一趟歸併中要多次用到2-路歸併演算法,

一趟歸併排序的操作是呼叫n/2h次演算法merge 將r1[1…n]中前後

相鄰且長度為h的有序段進行兩兩歸併,得到前後相鄰、長度為2h的有序段,並存放在r[1…n]中,

其 時間複雜度為o(n)。整個歸併排序需進行m(m=log2n)趟2-路歸併,

所以歸併排序總的時間複雜度為o(nlog2n)。

在實現歸併排序時,需要和待排記錄等數量的輔助空間,空間複雜度為o(n)。 

歸併排序的最大特點是,它是一種穩定的排序方法

排序專題 (2)歸併排序

一 以順序表為儲存結構的歸併排序 自頂向下遞迴分治 排序地基本邏輯略過,有詳細注釋 偽 template void mergesort t arr,int l,int r t aux l r 1 申請輔助陣列,可以malloc動態申請,也可以用vector void merge t arr,int ...

排序之歸併排序

歸併排序和快速排序的思想一樣,都是依據分治法 遞迴 兩者不同的是,歸併需要對子問題的解進行合併,即合併兩個已排序的表,合併的時間為線性的,最多進行了n 1次比較,其中n是元素的總數。歸併排序的基本思路就是將陣列分成二組a和b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如...

排序之歸併排序

歸併排序還是有點雲裡霧裡 尤其是遞迴的時候的狀態樹與函式呼叫時的棧的狀態不太清楚,需要寫 加斷點做測試 先記錄下來,後面有時間再弄,先查到乙個用斷點測試後,描述歸併排序時遞迴狀態樹的部落格 其實如果按照 極客大學 演算法訓練營的覃超老師講的分治的模板,應該比較好寫出來 分治的模板 int divid...