主要解決「原來這種思想是分治思想」的問題
將n個元素分成2個大小相同的子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合,n=1時中止。時間複雜度o(nlogn)
滿足:
該方法沒有使用分治法的直接條件,所以使用先分後治的思想,先將元素簡單分開,創造分治法子問題結果可合併的條件。
在實際程式中,分割n個元素不必真的產生不同的陣列,直接利用下標進行移動即可。之後在子集合元素合併時進行排序,這也是合併排序名稱的由來
#include
#include
#define overflow -1
void
merge
(int
*arr,
int left,
int middle,
int right)
int*a2 =
(int*)
malloc
(len2 *
sizeof
(int))
;if(!a2)
//轉存陣列初始化值
for(
int i =
0; i < len1;
++i)
for(
int i =
0; i < len2;
++i)
//兩個長度可能不等的有序數列的合併
int i = left;
while
(tmp1 < len1 && tmp2 < len2)
else
}while
(tmp1 < len1)
while
(tmp2 < len2)
free
(a1)
;free
(a2)
; a1 = a2 =
null;}
void
mergesort
(int
*arr,
int left,
int right)
}int
main()
for(
int i =
0; i < len;
++i)
mergesort
(array,
0, len -1)
;printf
("the sorted array is:\n");
for(
int i =
0; i < len;
++i)
else
}}
自然合併排序是合併排序演算法的一種改進,時間複雜度理論上為o(longn),但因實際中避免了很多比較,時間會小很多
對於初始給定的陣列,通常存在多個長度大於1,且已自然排好序的子陣列段。**自然合併排序用一次對陣列的線性掃瞄,就足以找出所有這些排好序的子陣列段。**然後將相鄰的排好序的子陣列段兩兩合併,構成更大的排好序的子陣列段。繼續合併相鄰排好序的子陣列段,直至整個陣列已排好序
通常情況下,按此方式進行合併排序所需的合併次數較少。對於所給的n元素陣列已排好序的極端情況,自然合併排序演算法不需要執行合併
(原始碼請參考:
#include
using
namespace std;
void
getindex
(int arr,
int index,
int len,
int&cnt)
} cnt = j;
}void
merge
(int c,
int d,
int l,
int m,
int r)
else}if
(i > m)
}else}}
void
mergepass
(int x,
int y,
int t,
int s,
int len,
int cnt)
if(i + s < cnt)
else
if(i < cnt)}}
void
mergesort
(int arr,
int index,
int len,
int cnt)
delete
temp;
}void
print
(int arr,
int len)
cout<}int
main()
int*index =
newint
[len]
;//每個有序子串行起始座標
int cnt =0;
//自然分組個數
getindex
(arr, index, len, cnt)
;mergesort
(arr, index, len, cnt)
;print
(arr, len)
;delete
index;
return0;
}
演算法導論 第二章演算法入門 合併排序
include include include include using namespace std 讀入檔案 void inputfile vector vec 合併程式 void merge vector vec,int p,int r,int q for j 1 j n2 j 這個是作為哨兵...
學習《演算法導論》第二章 合併排序 總結
分治策略 將原問題劃分成n個規模較小而結構與原問題相似的子問題 遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解.分治模式一般有三個步驟 分解 將原問題分解成一系列子問題 解決 遞迴地解決各子問題 合併 將子問題的結果合併成原問題的解 合併排序直觀地操作如下 分解 將n個元素分成n 2個元素...
分治演算法(二)合併排序
1.問題分析 合併排序問題給定的是乙個無序的序列,可以把待排序的元素分解為兩個規模大致相等的子串行。如果還是不容易解決就繼續將子串行分解,直到子串行中的元素個數為1,因為單個元素的序列本身是有序的,此時便可以進行合併,從而得到乙個完整的有序序列。2.演算法設計 1 分解 將待排序元素分成大小大致相同...