歸併排序(Merge Sort)

2021-07-26 04:39:51 字數 3139 閱讀 6892

歸併排序(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 相當於輸出...