前提:
1.待排序的子串行相對有序。
2.不考慮大資料等特殊情況。
#includeusing namespace std;
void merge_sort(int a,int p,int r);
void merge(int a,int p,int q,int r);
int b[20];
int main()
; int len=sizeof(a)/sizeof(a[0]);
merge_sort(a,0,len-1);
//輸出結果
for(int i=0;i=p&&j>=q+1)
else
}//下面兩個if用來處理剩餘的元素
while(i>=p)
while(j>=q+1)
b_index--;
for(int i=p;i<=r;i++)
}
演算法分析:
1.時間複雜度: 這裡的這個歸併排序,在merge_sort函式中遞迴的呼叫了兩次本身。所以這是乙個二叉樹的結構。 假設元素總量為n、設規模為1的問題所需時間為c,則在樹形結構中,第一層總時間為cn,第二層為c(n/2)+c(n/2)=cn,再往下推就發現每層都是cn。而二叉樹的層數(即深度),是lgn+1 。 所以總時間為t(n)=cn*lgn+cn .
綜上,歸併排序的時間複雜度為o(nlgn)。
2.用途:
a.速度僅次於
快速排序
,為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的數列。
b.具體思路是,在歸併的過程中計算每個小區間的逆序對數,進而計算出大區間的逆序對數(也可以用
樹狀陣列
來求解)。
歸併排序(合併排序)
題目 要求氣泡排序的交換次數,也就是求逆序數的個數。在乙個排列中如果有兩個數的排序和所規定的排序規則相反,則這兩個數是乙個逆序。乙個排列中的逆序的總數就是這個排列的逆序數。用歸併排序,求逆序數的個數。poj 2299 這道題充分印證了,即使merge本身可能用的不多,但分冶的思想卻是無所不在 inc...
歸併排序(合併排序)
合併排序 merge sort 是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又n個有序的子串行組成,每個子串行的長度為1,然後再兩兩合併,得到了乙個 n 2 個長度為2...
合併排序(歸併)
mergesort.h include using std vector class mergesort mergesort.cpp include stdafx.h include using std cout using std endl include using std vector inc...