合併排序(分治 驗證性 演算法第二章)

2021-10-06 11:51:42 字數 2575 閱讀 5280

主要解決「原來這種思想是分治思想」的問題

將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 分解 將待排序元素分成大小大致相同...