ACM基础(四):排序之归并排序


图解排序算法(四)之归并排序


一、原理

// 伪代码
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;
}
发布了461 篇原创文章 · 获赞 183 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/104510194