排序-->归并排序

归并排序

归并排序也称外部排序,是内存中的数据过大一般不能处理的情况下,我们选择用外部排序来解决,归并排序也是一种分治的思想,其实它就是把所要排序的内存空间一直二分下去,直到不能再分,然后又进行合并的一种排序方法;
这里写图片描述
从上图中我们可以看到,其实归并排序也不是很难:

void MergeSort(int* array, int size)
{
    int* tmp = new int[size];   //创建外部空间
    for(size_t i =0; i < size; i++)
    {
        tmp[i] = array[i];
    }

    merge_sort(array tmp, 0, size-1);
    delete[] tmp;
}

void merge_sort(int* array, int* tmp, int begin, int end)
{
    assert(array);
    assert(tmp);
    if(begin == end)
        return;
    int mid = begin + (end-begin)>>1;
    int begin1 = begin;
    int end1 = mid;
    int begin2 = mid+1;
    int end2 = end;

    merge_sort(array, tmp, begin1, end1);   //进行左右递归
    merge_sort(array, tmp, begin2, end2);   

    int t = begin;
    while(begin1 <= end1 && begin2 <= end2)
    {
        if(array[begin1] > array[begin2])
            tmp[t++] = array[begin2++];
        else
            tmp[t++] = array[begin1++];
    }
    while(begin1 <= end1)//轮空的也要归并回去
    {
        tmp[t++] = array[begin1++];
    }
    while(begin2 <= end2)
    {
        tmp[t++] = array[begin2++];
    }
    for(int i =0; i <= end; i++)//拷回原来的空间中去
    {
        array[i] = tmp[i];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值