排序 歸併排序

2021-09-12 07:51:28 字數 2390 閱讀 6560

​ 歸併排序的思想是:如果要對乙個陣列進行排序,可以先(遞迴地)將它分成兩半分別排序,然後將結果歸併起來。歸併演算法最吸引人的性質是它能保證將任意長度為n的陣列排序所需時間和 nlo

gn

nlogn

nlog

n 成正比;缺點則是它所需的額外空間和n成正比。

​ 將兩個不同的有序陣列歸併起來,可以採用原地歸併的方法,這樣就可以先將前半部分排序,再將後半部分排序,然後在陣列中移動元素而不需要使用額外的空間。

​ 下面就是對原地歸併的抽象方法:

// 該方法可以將子陣列 a[l...mid] 和 a[mid+1...r]歸併成乙個有序陣列,並存放在a[l...r]

// 子陣列 a[l...mid] 和 a[mid+1...r]都是有序的

void merge(int *a, int l, int mid, int r)

i = l;

j = mid + 1;

for(k=l; k<=r; k++)

else if(j > r)

else if(aux[i] > aux[j])

else

}delete aux;

}

【思想】

​ 自頂向下的歸併排序應用了分治的思想。

【演算法過程】

​ 如果要對子陣列 a[l

...r

]a[l...r]

a[l...

r]進行排序,自頂向下的歸併排序會先將 a[l

...r

]a[l...r]

a[l...

r]分為 a[l

...m

id

]a[l...mid]

a[l...

mid]

和 a[l.

..r]

a[l...r]

a[l...

r]兩部分,分別通過遞迴呼叫將它們單獨排序,最後將有序的子陣列歸併為最終的排序結果。

【**】

// 對陣列a[l..r]進行自頂向下的歸併排序

void top_down_sort(int *a, int l, int r)

【演算法分析】

​ 對於長度為n的任意陣列,自定向下的歸併排序:

(1)時間複雜度為nlo

gn

nlogn

nlogn;

(2)空間複雜度為n;

(3)是穩定排序;

(4)不是原地排序。

【思想】

​ 自底向上的歸併排序是一種非遞迴的方法,它的思想是:先歸併那些微型陣列,然後再成對歸併得到的子陣列,如此這般,知道將整個陣列歸併到一起

【演算法過程】

​ 自底向上的歸併排序,首先進行的是兩兩歸併(把每個元素想象成乙個大小為1的陣列),然後四四歸併(將兩個大小為2的陣列歸併成乙個4個元素的陣列),然後八八歸併,一直下去。例如:

對陣列[5, 4, 9, 2, 6]進行自底向上的歸併排序:

第一輪(兩兩歸併):

(5, 4) -> (4, 5) (9, 2) -> (2, 9)

第二輪(四四歸併)

(4, 5)(2, 9) -> (2, 4, 5, 9)

第三輪(八八歸併)

(2, 4, 5, 9)(6) -> (2, 4, 5, 6, 9)

在每一輪歸併中,最後一次歸併的第二個子陣列可能比第乙個陣列要小(例如上例中的第三輪,但這對merge()方法不是問題),否則兩個陣列應該是大小一樣的,而這在下一輪中子陣列的大小會翻倍。

【**】

// 對長度為n的陣列a進行自底向上的歸併排序

void down_top_sort(int *a, int n)

// 自底向上

void down_top_sort(int *a, int n)

else if(j > r)

else if(aux[i] > aux[j])

else

}delete aux;

}};int main()

; int i, j, k;

mergesort ms;

ms.down_top_sort(a, 8);

for(i=0; i<8; i++)

cout << endl;

return 0;

}

​ 歸併排序對於長度為n的任意陣列:

(1)時間複雜度為nlo

gn

nlogn

nlogn;

(2)空間複雜度為n;

(3)是穩定排序;

(4)不是原地排序。

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...

排序 歸併排序

利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...