演算法學習之路(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,intrightend)
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,intrightend)
}
(3)呼叫該mergesort函式對陣列進行排序
函式宣告:
void mergesort(int* source,int length);
@param source 源陣列
@param length 陣列長度
函式實現:
void mergesort(int* source,intlength)
實驗**:
intmain();
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...