二路歸併排序 非遞迴實現

2022-09-03 04:21:10 字數 1629 閱讀 2630

歸併排序是一種借助」歸併「進行排序的方法。

歸併的含義是將兩個或兩個以上的有序序列歸併為乙個有序序列的過程。歸併排序的主要思想是:將若干有序序列逐步歸併,最終歸併為乙個有序序列。

其中最常見的是二路歸併排序。

二路歸併排序是一種穩定的排序方法,其基本思想是:將若干個有序序列兩兩歸併,直到形成乙個有序序列為止。

方法如下:將乙個長度為n的無序序列看作是n個長度為1的有序序列的集合。然後兩兩歸併,直到整個序列有序。

在歸併的過程中,可能會破壞原序列的有序性,所以需要乙個新的陣列在儲存歸併後的結果。

一次歸併的演算法是從開始同時遍歷兩個序列,將較小的值放入結果序列中,直到遍歷結束,成為乙個有序序列。

**如下:

1

void merge(int r,int r1,int s,int m,intt)2

12else

1318}19

if(i<=m)

2027}28

else

2936

}37 }

然後,一趟遍歷只需要不斷呼叫一次歸併的演算法就可以實現了。

1

void mergepass(int r ,int r1 , int n, inth)2

9if(i1) merge(r,r1,i,i+h-1

,n);

10else

for(int k=i; k<=n; k++)

1114 }

開始時,有序序列長度為1,結束時,有序序列長度為n,所以,可以用有序序列的長度來控制排序的結束時刻。同時,排序次數為奇數時,還需要將輔助陣列中的值放回原陣列。

下面給出歸併排序非遞迴演算法:

1

void mergesort(int r,int r1, intn)2

11 }

對於二路歸併排序來說,它的時間複雜度比較直觀,執行一趟需要掃瞄資料一次,一趟的時間複雜度為o(n)。整個歸併排序需要執行[log2n]趟。所以,總體的時間複雜度為o(nlogn)。

對於空間複雜度,在排序時,演算法使用了乙個與待排序序列等長的輔助空間來存放結果,所以其空間複雜度為o(n)。

所以說,二路歸併排序是一種穩定的排序方法,它的最好、最壞、平均的時間複雜度相等。

下面給出完整**:

1 #include2

using

namespace

std;34

void merge(int r,int r1,int s,int m,intt)5

15else

1621}22

if(i<=m)

2330}31

else

3239}40

}4142void mergepass(int r ,int r1 , int n, int

h)43

50if(i1) merge(r,r1,i,i+h-1

,n);

51else

for(int k=i; k<=n; k++)

5255}56

57void mergesort(int r,int r1, int

n)5867}

6869

intmain()

70

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為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的有...