一、基本運算:
兩路合併排序:將兩個有序序列合併成乙個有序序列。
二、步驟:
①把待排序的序列分成長度為1的子串行(只包含乙個記錄的序列被認為是有序的)→得到n個長度為1的有序子串行;
②實施兩兩合併,合併相鄰的兩個子串行→得到大約n/2個長度為2的有序子串行;
③重複步驟②,直到合併成乙個長度為n的有序序列為止。
三、注意:
當待排序序列個數為奇數時,最後乙個長度為1的子串行則在最後一趟進行排序。
四、舉例:
以對序列a[0], a[l]…, a[n-1]進行公升序排列來進行講解,在此採用自頂向下的實現方法,操作步驟如下。
①將所要進行的排序序列分為左右兩個部分,如果要進行排序的序列的起始元素下標為first,最後乙個元素的下標為last,那麼左右兩部分之間的臨界點下標mid=(first+last)/2,這兩部分分別是a[first … mid]和a[mid+1 … last];
②將上面所分得的兩部分序列繼續按照步驟(1)繼續進行劃分,直到劃分的區間長度為1;
③將劃分結束後的序列進行歸併排序,排序方法為對所分的n個子序列進行兩兩合併,得到n/2或n/2+l個含有兩個元素的子串行,再對得到的子串行進行合併,直至得到乙個長度為n的有序序列為止。
五、函式:
merge函式
①功能:將兩個有序序列合併成乙個有序序列;
②c**:
void merge(int arr,int low,int mid,int high)
{ int left_low=low; //左邊序列的左下標
int left_high=mid;
int right_low=mid+1; //右邊序列的左下標
int right_high=high;
int tmp[n],k=0,i; //陣列tmp用來存放序列元素
while(left_low<=left_high&&right_low<=right_high) //當左右序列都有元素時執行迴圈
{ if(arr[left_low]mergesort函式
①功能:通過呼叫自身**子串行;通過呼叫merge函式實現兩路合併排序。
②**:
void mergesort(int arr,int first,int last)
{ int mid = 0;
if(first六、**
#include #include #define n 7
void merge(int arr,int low,int mid,int high)
{ int left_low=low; //左邊序列的左下標
int left_high=mid;
int right_low=mid+1; //右邊序列的左下標
int right_high=high;
int tmp[n],k=0,i; //陣列tmp用來存放序列元素
while(left_low<=left_high&&right_low<=right_high) //當左右序列都有元素時執行迴圈
{ if(arr[left_low]
C語言 合併排序。
題目 設子陣列a 0 k 和a k 1 n 1 已排好序 0 k n 2 試設計乙個合併這兩個子陣列為排好序的陣列a 0 n 1 的演算法。要求演算法的在最壞情況下所用的計算時間為o n 且只用到o 1 的輔助空間。include void houyi int a,int l,int r int m...
分治 合併排序 自然合併排序(C )
演算法步驟 引用自 菜鳥教程 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟 3 直到某一指標達到序列尾 將另一串行剩下的所有元素直...
合併排序(C語言實現
遞迴演算法是把乙個問題分解成和自身相似的子問題,然後再呼叫自身把相應的子問題解決掉。這些演算法用到了分治思想。其基本模式如下 分解 把乙個問題分解成與原問題相似的子問題 解決 遞迴的解各個子問題 合併 合併子問題的結果得到了原問題的解。現在就用遞迴演算法,採用上面的分治思想來解合併排序。合併排序 非...