一、原理
// 伪代码
MERGE-SORT(A, p, r)
if p<r
then q ← ⌊(p + r) / 2)⌋
MERGE-SORT(A, p, q)
MERGE-SORT(A, q + 1, r)
MERGE(A, p, q, r)
MERGE(A, p, q, r)
n1 ← q - p + 1
n2 ← r - q
create arrays L[1..n1+1] and R[1..n2+1]
for i ← 1 to n1
do L[i] ← A[p + i - 1]
for j ← 1 to n2
do R[j] ← A[q + j]
L[n1 + 1] ← ∞
R[n2 + 1] ← ∞
i ← 1
j ← 1
for k ← p to r
do if L[i] ≦ R[j]
then A[k] ← L[i]
i ← i + 1
else A[k] ← R[j]
j ← j+1
二、特点
优点:
- 外部排序:可以不用一次全部读入
- 稳定的排序算法:同值的元素保持原来的先后顺序
缺点:
- 需要额外创建的空间代价
快速(主流)、归并、堆
三、实现
#include <iostream>
#include <math.h> // for floor()
#include <limits.h> // for INT_MAX
using namespace std;
void merge(int A[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L = new int[n1];
int *R = new int[n2];
for (int i = 0; i < n1; i++)
{
L[i] = A[p + i];
}
for (int j = 0; j < n2; j++)
{
R[j] = A[q + 1 + j];
}
L[n1] = INT_MAX;
R[n2] = INT_MAX;
for (int i = 0, j = 0, k = p; k <= r; k++)
{
if (L[i] <= R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
}
}
// 下标从p到q(包括q)
void merge_sort(int A[], int p, int r)
{
if (p < r)
{
int q = floor((p + r) / 2);
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
merge(A, p, q, r);
}
}
int main()
{
int A[] = {5, 3, 4, 2, 7, 1, 6, 0};
int length = sizeof(A) / sizeof(int);
merge_sort(A, 0, length - 1);
for (int i = 0; i < length; i++)
{
cout << A[i] << ' ';
}
return 0;
}