歸併排序演算法

2021-09-06 18:39:22 字數 2080 閱讀 1210

歸併排序(merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

乙個歸併排序的例子:對乙個隨機點的鍊錶進行排序

歸併操作的過程如下:

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

重複步驟3直到某一指標到達序列尾

將另一串行剩下的所有元素直接複製到合併序列尾

特點:歸併排序是穩定的排序.即相等的元素的順序不會改變,  速度僅次於快速排序,但較穩定。

歸併操作(merge),也叫歸併演算法,指的是將兩個順序序列合併成乙個順序序列的方法。

如:設有數列 [6,202,100,301,38,8,1]

初始狀態:6, 202, 100, 301, 38, 8, 1

第一次歸併後:[6, 202], [100, 301], [8, 38], [1],比較次數:3;

第二次歸併後:[6, 100, 202, 301],[1, 8, 38],比較次數:4;

第三次歸併後:[1, 6, 8, 38, 100, 202, 301],比較次數:4;

總的比較次數為:3+4+4=11,;

逆序數為14;

//

completed on 2014.10.11 17:20

//language: c99

////

//#include#include

void merge_sort(int *list, const

int first, const

intlast)

while( left_min

while( index > 0

) }}

free(tmp);

}int

main()

;

intn, mid;

n = sizeof(a) / sizeof(a[0

]); mid = n / 2

; merge_sort(a,

0, n - 1

);

for(int k = 0; k < n; k++)

printf(

"%d

", a[k]);

printf("\n

");return0;

}

使用遞迴實現:

//

completed on 2014.10.11 18:20

//language: c99

////

//#include#include

void merge(int *array,const

int first, const

int mid, const

intlast)

else

}while( first1 <=last1 )

while( first2 <=last2 )

for( i=0; i

free(tmp);

}void merge_sort(int *array, const

int first, const

intlast)

}int

main()

;

intn, mid;

n = sizeof(a) / sizeof(a[0

]); mid = n / 2

; merge_sort(a,

0, n - 1

);

for(int k = 0; k < n; k++)

printf(

"%d

", a[k]);

printf("\n

");return0;

}

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...

歸併排序演算法

include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...

歸併排序演算法

這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...