歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。
歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。
設兩個有序的子串行放在同一序列中相鄰的位置上:a[low..m]和a[m + 1..high],先將它們合併到乙個區域性的暫存序列 temp 中,待合併完成後將 temp 複製回 array[low..high]中,從而完成排序。合併過程:
(1)設定 i,j 和 p 三個指標,其初值分別指向這三個記錄區的起始位置。
(2)依次比較 array[i] 和 array[j] 的關鍵字,取關鍵字較小(或較大)的記錄複製到 temp[p] 中
(3)將被複製記錄的指標 i 或 j 加 1,以及指向複製位置的指標 p加 1。
(4)重複這一過程直至兩個輸入的子串行有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子串行中剩餘記錄依次複製到 array 中即可。
歸併排序分為兩大步驟:
(1)「分解」——將序列每次折半劃分。
(2)「合併」——將劃分後的序列段兩兩合併後排序。
遞迴或者迴圈實現分解合併。
**
#include
#define n 9
int arr1[n]=;
int arr2[n]=;
int step=0;
int dep=0;
/* 列印陣列 */
void printarr(int
array, int start, int mid, int end)}}
printf("]}\n");
}/*
* 函式功能:兩個子串行合併為乙個 [start,mid] [mid+1,end]
* source:原序列;temp:中間序列(合併存放);start:原序列起始位置;mid:原序列中間位置;end:原序列結束位置
*/void merge(int source,int temp, int start, int mid, int end)
/* 序列1未完,將剩餘元素放入中間序列之後 */
while(i <= mid)
temp[k++] = source[i++];
/* 序列2未完,將剩餘元素放入中間序列之後 */
while(j <= end)
temp[k++] = source[j++];
/* 將合併完成的序列放回原序列 */
for(i=start; i<=end; i++)
source[i] = temp[i];
printf("after merge:");
printarr(source,start,end,end);
}/* 歸併排序--內部使用遞迴分解 */
void merge_sort(int source, int temp, int start, int end)
}/* 歸併排序--for迴圈分解 */
void merge_sort_for(int source, int temp, int len)
if(i+s1, len-1); //在序列長度範圍內最後一次合併有可能出現不等長的情況} }
}void main()
; printf("before...\n");
printarr(arr1,0,n-1,n-1);
printf("sorting...\n");
merge_sort(arr1,temp,0,n-1);
printf("sorted.\n");
printf("before...\n");
printarr(arr2,0,n-1,n-1);
printf("sorting by for...\n");
merge_sort_for(arr2,temp,n);
printf("sorted.\n");
}
結果
before...
sorting...
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
sorted.
before...
sorting by for...
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
before merge:
after merge:
sorted.
歸併排序的最好、最壞和平均時間複雜度都是o(nlogn)
,而空間複雜度是o(n),同時歸併排序是穩定的,但是這種演算法很消耗空間,一般來說在內部排序不會用這種方法,而是用快速排序;外部排序才會考慮到使用這種方法。
歸併排序 Merge sort
merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...
歸併排序(merge sort)
歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...
歸併排序 Merge Sort
歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...