【
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用
分治法
(divide and conquer)的乙個非常典型的應用。合併排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序,合併排序也叫歸併排序。
1、遞迴實現的合併排序
[cpp]view plain
copy
//2d7-1 遞迴實現二路歸併排序
#include "stdafx.h"
#include
using
namespace
std;
inta = ;
intb[7];
template
<
class
type>
void
merge(type c,type d,
intl,
intm,
intr);
template
<
class
type>
void
mergesort(type a,
intleft,
intright);
intmain()
cout
for(
inti=0; i<7; i++)
cout
template
<
class
type>
void
merge(type c,type d,
intl,
intm,
intr)
else
} if(i>m)
} else
} } template
<
class
type>
void
mergesort(type a,
intleft,
intright)
} }
2、合併排序非遞迴實現
從分支策略機制入手,可消除程式中的遞迴。非遞迴實現的大致思路是先將陣列a中元素兩兩配對,用合併演算法它們排序,構成n/2組長度為2的排好的子陣列段,然後再將它們排成長度為4的排好序的子陣列段,如此繼續下去,直到整個陣列排好序。
程式**如下:
[cpp]view plain
copy
//2d7-1 自然二路歸併排序
#include "stdafx.h"
#include
using
namespace
std;
inta = ;
intb[7];
template
<
class
type>
void
merge(type c,type d,
intl,
intm,
intr);
template
<
class
type>
void
mergepass(type x,type y,
ints,
intn);
template
<
class
type>
void
mergesort(type a,
intn);
intmain()
cout
for(
inti=0; i<7; i++)
cout
template
<
class
type>
void
merge(type c,type d,
intl,
intm,
intr)
else
} if(i>m)
} else
} } template
<
class
type>
//合併大小為s的相鄰子陣列
void
mergepass(type x,type y,
ints,
intn)
//剩下的元素個數少於2s
if(i+s
else
} } template
<
class
type>
void
mergesort(type a,
intn)
}
程式清單中77至86行解釋如下:當剩餘元素少於2s時,分兩種情況。
1、當i+s
2、當i+s>=n時,剩餘元素已排好序,直接複製。例如:設s=4,n=11,i=8有如下圖:
分治法 合併排序
排序演算法是對一組數進行順序排序或者逆序排序,而合併排序就是排序演算法的一種。合併排序用到了分治策略實現對元素進行排序。合併排序的基本思想 把待排序的n個元素分解成n組,也就是每組乙個元素 之後對分好的組進行兩兩合併 無配對的則不操作 以此類推。以序列為例,排序過程如下 合併排序又叫做2 路歸併排序...
分治法合併排序(C )
參考 include include include using namespace std 合併函式 void merge int arr,int p,int q,int r for int j 0 j len2 j l len1 r len2 int max 定義無窮大 int i 0,j 0 ...
基礎演算法 合併排序(分治法)
基礎演算法 合併排序演算法 分治法 的宗旨是將問題 分解 處理 歸併 將書中的偽 翻譯為c c 語言實現,大致可用兩個函式來解決問題,第乙個函式實現 治 也就是分解問題,處理問題 的步驟,另乙個函式通 過遞迴實現 分 合 的操作。實現 分 治 的函式實現如下 void merge int parra...