【算法】排序算法第四讲:归并排序

来源:互联网 发布:淘宝怎么做全屏海报 编辑:程序博客网 时间:2024/06/05 00:37

插入排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75091908
选择排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75092407
交换排序,链接戳这里:http://blog.csdn.net/chaseraod/article/details/75094970

本文是常见排序算法的最后一讲,归并排序。
基本思想:设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 tmp (相当于输出序列)中,待合并完成后将 tmp 复制回 array[low..high]中,从而完成排序。

如图:
这里写图片描述

代码:

void Merge(int* a, int* tmp, int begin1, int end1, int begin2, int end2){    size_t pos = begin1;    size_t index = begin1;    while (begin1 <= end1 && begin2 <= end2)    {        if (a[begin1] < a[begin2])            tmp[index++] = a[begin1++];        else            tmp[index++] = a[begin2++];    }    while (begin1 <= end1)    {        tmp[index++] = a[begin1++];    }    while (begin2 <= end2)    {        tmp[index++] = a[begin2++];    }    memcpy(a + pos, tmp + pos, sizeof(int)*(end2 - pos + 1));}void _MergeSort(int* a, int* tmp, int left, int right){    if (left >= right)        return;    int mid = left + (right - left) / 2;    // 0 0 1 1    // [left mid] [mid+1, right]    _MergeSort(a, tmp, left, mid);    _MergeSort(a, tmp, mid + 1, right);    Merge(a, tmp, left, mid, mid + 1, right);}void MergeSort(int* a, size_t n){    assert(a);    int* tmp = new int[n];    _MergeSort(a, tmp, 0, n - 1);    delete[] tmp;}

测试:

int main(){    int a[] = { 1, 5, 3, 2, 8, 0, 7, 9, 4, 6 };    int sz = sizeof(a) / sizeof(a[0]);    MergeSort(a,sz);    for (int i = 0; i < sz; i++)    {         cout << a[i] << " ";    }    cout << endl;    system("pause\n");    return 0;}

运行结果:
这里写图片描述

这里写图片描述

原创粉丝点击