演算法學習之路(1) 二路歸併排序

2022-08-22 21:06:12 字數 1529 閱讀 6461

演算法學習之路(1)——二路歸併排序

基本思想是:

(1)初始時,將有n個元素的序列看成是n個長度為1的有序子串行,

(2)然後兩兩合併子串行,得到n/2個長度為2或1的有序子串行;再兩兩合併,…,直到得到乙個長度為n的有序序列時結束。

演算法實現例子:

(1)首先定義乙個用來合併兩個子串行的merge函式

方法宣告:

void merge(int* source,int* temp,int leftstart,int rightstart,int rightend);

@param source 待排序的初始陣列

@param temp 排序過程中臨時存放元素的陣列

@param leftstart 當前一輪比較,左邊元素的下標

@param rightstart 當前一輪比較,右邊元素的下標

@param rightend 當前一輪比較,右邊子串行末端元素下標

方法實現:

void merge(int* source,int* temp,int leftstart,int rightstart,int

rightend)

else

}//若左邊子串行長度大於右邊子串行,則將左邊剩餘的元素複製到temp中去

while(leftstart <=leftend)

//若右邊子串行長度大於左邊子串行,則將右邊剩餘的元素複製到temp中去

while(rightstart <=rightend)

for(int i = 0;i)

}

(2)定義排序函式mergesort,遞迴呼叫merge函式

函式宣告:

void mergesort(int* source,int* temp,int leftstart,int rightend);

@param source 源陣列

@param temp 排序臨時存放元素的臨時陣列

@param leftstart 序列的起始位置

@param rightend 序列的結束位置

函式實現:

void mergesort(int* source,int* temp,int leftstart,int

rightend)

}

(3)呼叫該mergesort函式對陣列進行排序

函式宣告:

void mergesort(int* source,int length);

@param source 源陣列

@param length 陣列長度

函式實現:

void mergesort(int* source,int

length)

實驗**:

int

main();

mergesort(a,

20);

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

delete a;

}

輸出結果:

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...

歸併排序(二路歸併)

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