歸併排序(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 下面採用遞迴排...