排序演算法7 歸併排序

2021-10-01 04:01:53 字數 1766 閱讀 2951

【歸併排序】

歸併排序的演算法思想:將兩個或兩個以上的元素有序序列合併為乙個有序序列。其中,二路歸併排序是最常見的歸併排序。

【演算法思想】

二路歸併排序的主要演算法思想是:假設元素個數是n,將每個元素作為乙個有序的子串行。繼續將相鄰的兩個有序子串行兩兩合併得到

【示例】

假設待排序元素序列為49,23,66,52,34,75,99,18。使用歸併排序對該序列的排序過程如圖所示。

初始時,可以將單個元素看作是乙個有序的子串行,通過將兩個相鄰的子串行合併,子串行中元素個數就變成了兩個,如此不斷反覆,直到子串行的個數只有乙個,這樣,待排序元素就構成了乙個有序的序列。

code:

#include#includevoid copyarray(int source, int dest, int len, int first);

void mergesort(int a, int left, int right);

void merge(int a, int left, int right);

void disparray(int a, int n);

void main()

; int len = sizeof(a) / sizeof(int);

printf("排序前陣列中的元素:\n");

disparray(a, len);

mergesort(a, 0, len - 1);

printf("排序後陣列中的元素:\n");

disparray(a, len);

getchar();

}void mergesort(int a, int left, int right)

/*歸併排序*/

}void merge(int a, int left, int right)

/*合併兩個子串行中的元素*/

while (begin1 <= mid)

b[k++] = a[begin1++];

while (begin2 <= right)

b[k++] = a[begin2++];

copyarray(b, a, len, left);

free(b);

}void copyarray(int source, int dest, int len, int start)

/*將source陣列中的元素複製到dest陣列中.

其中,len是源陣列長度,start是目標陣列起始位置*/

{ int i, j = start;

for (i = 0; i結果:

【主要用途】

歸併排序演算法實現複雜,因為二路歸併排序演算法需要臨時空間較大,所以常常用在外部排序中。

【穩定性和複雜度】

歸併排序是一種穩定的排序演算法。

二路歸併排序的過程需要進行$\lceil log_2n \rfceil$趟。二路歸併排序演算法需要多次遞迴呼叫自己,其遞迴呼叫的過程可以構建乙個二叉樹的結構,它的時間複雜度為t(n)≤n+2t(n/2)≤n+2*(n/2+2*t(n/4))=2n+4t(n/4)≤3n+8t(n/8)≤...≤nlog_2n+nt(1),即o(nlog_2n)。

二路歸併排序的空間複雜度為o(n)。

排序演算法 7 歸併排序

歸併排序思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。最簡單的 歸併 是直接將兩個有序的子表合併成乙個有序的表。歸併排序 2 路歸併實現 void merge int r,int low,int mid,int high else 將第1段餘下的部分複製到r1 while i mid 將第...

排序7 歸併排序

7.1原理 設原資料為 兩個數字一組之間歸併 二路歸併 誰小誰下來 需要新陣列放排序後資料 再4個數字一組,比較l1與l2數字誰小誰下來且下標後移,直到l1 h1或,l2 h2 剩餘沒下來的數字再下來 再8個數字,16個數字 一組,直到整體有序,因此快 7.2 每次歸併 void merge int...

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...