【歸併排序】
歸併排序的演算法思想:將兩個或兩個以上的元素有序序列合併為乙個有序序列。其中,二路歸併排序是最常見的歸併排序。
【演算法思想】
二路歸併排序的主要演算法思想是:假設元素個數是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 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...