八大排序算法(六)—merge

本文详细介绍了归并排序的实现方法,包括递归和非递归两种方式,并提供了完整的C++代码示例。通过本文,读者可以了解到归并排序的基本原理及其在实际应用中的具体操作步骤。

#include "SortAll.h";
using namespace std;

void merge(int *sr, int *tr, int i, int m, int t)
{
    int j, k, l;
    for (j = m + 1, k = i; i <= m&&j <= t; ++k)
    {
        if (sr[i] < sr[j])
        {
            tr[k] = sr[i++];
        }
        else
        {
            tr[k] = sr[j++];
        }
    }
    if (i <= m)
    {
        for (l = 0; l <= m - i; l++)
        {
            tr[k + l] = sr[i + l];
        }
    }
    if (j <= t)
    {
        for (l = 0; l <= t - j; l++)
        {
            tr[k + l] = sr[j + l];
        }
    }
}

void Msort(int *sr,int *tr1,int s, int t )
{
    int m;
    int tr2[MAXSIZE];
    if (s == t)
    {
        tr1[s] = sr[s];
    }
    else
    {
        m = (t+s) / 2;
        Msort(sr, tr2, s, m);
        Msort(sr, tr2, m + 1, t);
        merge(tr2, tr1, s, m, t);
    }

}

void mergeSort(int *a, int len)
{
    Msort(a, a, 0, len-1);
}


void mergePass(int *sr, int*tr, int s, int n)
{
    int i = 0;
    int j;
    while (i <= n - 2 * s + 1)
    {
        merge(sr, tr, i, i + s - 1, i + 2 * s - 1);
        i = i + 2 * s;
    }
    if (i < n - s + 1)
    {
        merge(sr, tr, i, i + s - 1, n);
    }
    else
    {
        for (j = i; j <= n; j++)
        {
            tr[j] = sr[j];
        }
    }
}

void mergeSort1(int *a, int len) //非递归
{
    int *tr = new int[MAXSIZE];//申请动态数组,也称堆内存
    int k = 1;
    while (k < len)
    {
        mergePass(a, tr, k, len-1);
        k = 2*k;
        mergePass(tr, a, k, len-1);//怎么样都把最后的排序结果放到原数组中了
        k = 2*k;
    }
    delete[]tr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值