經典演算法 歸併排序

2022-03-30 22:36:01 字數 2054 閱讀 2157

題目說明:歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法(divide and conquer)的乙個非常典型的應用。演算法複雜度為o(n*logn)。

題目解析:歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列。

歸併排序包括兩個步驟:

1)劃分子表

2)合併半子表 

偽**:

合併排序偽**(使用哨兵):

merge(a,p,q,r):

n1 n2

create array l[

0,n1] and r[0

,n2]

for i

do l[i]

for j

do r[j]

] l[n1]

r[n2]

i j

for k i

doif l[i]<=r[j]

then a[k]

i else a[k]

j //通過呼叫merge完成排序:

merge_sort(a,p,r):

if p

then q

向下取整

merge_sort(a,p,q) //

分治 merge_sort(a,q+1

,r) merge(a,p,q,r)

//合併結果

程式**:

#include #include 

using

namespace

std;

template

void merge(t* data, int low, int mid, int

high)

else

}//把左邊剩餘的數移入陣列

while (i <=mid)

//把右邊邊剩餘的數移入陣列

while (j <=high)

//把新陣列中的數覆蓋nums陣列

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

delete

tmp;

}template

void mergesort(t* data, int low, int

high)

}template

static

void showelem(t&val)

template

static

bool validate(t* data, int

len)

}return

true;}

test(algo, tmergesort)

; mergesort(d1,

0, 7

); for_each(d1, d1+8, showelem);

assert_true(validate(d1,

8));

cout

<

int d2 = ;

mergesort(d2,

0, 0

); for_each(d2, d2+1, showelem);

assert_true(validate(d2,

1));

cout

<

int d3 = ;

mergesort(d3,

0, 18

); for_each(d3, d3+19, showelem);

assert_true(validate(d3,

19));

cout

<

}

執行結果:

看書、學習、寫**

經典排序演算法之 歸併排序

1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併的時間為o n 故其時間複雜度...

經典排序演算法之歸併排序

原理,把原始陣列分成若干子陣列,對每乙個子陣列進行排序,繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完,形成有序的陣列 舉例無序陣列 6 2 4 1 5 9 先看一下每個步驟下的狀態,完了再看合併細節 第一步 6 2 4 1 5 9 原始狀態 第二步 2 6 1 4 5 9 兩兩合併排序,...

經典排序演算法 歸併排序Merge sort

經典排序演算法 歸併排序merge sort 原理,把原始陣列分成若干子陣列,對每乙個子陣列進行排序,繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完,形成有序的陣列 舉例 無序陣列 6 2 4 1 5 9 先看一下每個步驟下的狀態,完了再看合併細節 第一步 6 2 4 1 5 9 原始狀態...