排序算法 —— 归并排序

归并排序算法

1.划分问题:把序列分成元素个数尽量相等的两半。

2.递归求解:把两半元素分别排序。

3.合并问题:把两个有序表合并成一个。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法代码

void merge_sort(int *A, int x, int y, int *T) {
    if (y - x > 1) //等价于x+1<y,即左半部分的右边界还在右半部分的左边界左边
    {
        int m = x + (y - x) / 2;
        //划分
        int p = x, q = m, i = x;
        merge_sort(A, x, m, T);
        //递归求左解
        merge_sort(A, m, y, T);
        //递归求右解
        while (p < m || q < y)
        {
            if (q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];
            //从左半数组复制到临时空间
            else T[i++] = A[q++];
            //从右半数组复制到临时空间
        }
        for (i = x; i < y; ++i) A[i] = T[i];
        //从辅助空间复制回A数组
    }
}

动图演示

在这里插入图片描述
在这里插入图片描述

实战演练

#include <iostream>

using namespace std;
int A0[15] = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
int T0[15];

void merge_sort(int *A, int x, int y, int *T) {
    if (y - x > 1) //等价于x+1<y,即左半部分的右边界还在右半部分的左边界左边
    {
        int m = x + (y - x) / 2;
        //划分
        int p = x, q = m, i = x;
        merge_sort(A, x, m, T);
        //递归求左解
        merge_sort(A, m, y, T);
        //递归求右解
        while (p < m || q < y)
        {
            if (q >= y || (p < m && A[p] <= A[q])) T[i++] = A[p++];
            //从左半数组复制到临时空间
            else T[i++] = A[q++];
            //从右半数组复制到临时空间
        }
        for (i = x; i < y; ++i) A[i] = T[i];
        //从辅助空间复制回A数组
    }
}

int main() {
    for (int m = 0; m < 15; ++m) {
        cout << A0[m] << ' ';
    }
    cout << endl;
    merge_sort(A0, 0, 15, T0);
    for (int n = 0; n < 15; ++n) {
        cout << A0[n] << ' ';
    }
    cout << endl;
    return 0;
}
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

算法精讲

首先,只要有一个序列非空,就要继续合并(while (p < m || q < y)),因此在比较时不能直接比较A[p]和A[q],因为可能其中一个序列为空,从而A[p]或者A[q]代表的是一个实际不存在的元素。

算法分析

归并排序是一种稳定的排序方法。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。代价是需要额外的内存空间。

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/89028347
今日推荐