二路歸併排序及其改進方法

2021-08-10 09:17:17 字數 823 閱讀 1683

二路歸併排序的演算法

歸併:

void merge(elemtype a,int low,int mid, int high)

while(i<=mid) a[k++]=b[i++];

while(j<=high) a[k++]=b[j++];

}

排序

void mergesort(elemtype a,int low,int high)

} //注意:該演算法是遞迴演算法,第一趟歸並不一定是兩兩歸併,有可能會出現頭兩個歸併後再和第三個歸併。

改進:先對原始序列掃瞄一次,並把序列劃分成各個有序子串行,

如1,3,4,2,5,8,7劃分成(1,3,4),(2,5,8),(7)。再對各個子串行歸併排序。

如何劃分?劃分就是要記下每個子串行的首尾,為了能夠按順序記錄,我們用佇列儲存各子串行的頭元素。

本演算法用不帶頭節點的單鏈表結構。

void merge(linklist la,linklist lb,linklist &lc)

else

}//因為是不帶頭節點的,所以第乙個元素應該特殊處理

pc=lc;

while(pa&&pb)

else

} //直接把剩餘部分的指標連線到lc的尾部

if(pa) pc->next=pa;

if(pb) pc->next=pb;

}void mergesort(linklist &r)

//排序

while(!empty(q))

}

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...

二路歸併排序

二路歸併排序是將兩個有序表合併成乙個有序表的排序方法。其基本思想為 序列中有 n個記錄,可以看作為 n個有序子串行,每個序列長度為 1。首先將每相鄰的兩個記錄合併,得到 n 2 個較大的有序子串行,每個序列長度為 2。再將上述子串行兩兩合併,得到 n 2 2 個有序子串行,直至得到乙個長度為 n的有...