排序算法三归并排序

本文详细介绍了归并排序的原理及其实现方式,包括递归和非递归两种方法,并提供了具体的代码示例。同时,文章还分析了归并排序的时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。

这里写图片描述

递归代码实现:

void Merge(int array[], int *temp, int left, int mid, int right)
{
    int start1 = left;
    int end1 = mid;

    int start2 = mid+1;
    int end2 = right;

    int index = left;
    while(start1 <= end1 && start2 <= end2)
    {
        if(array[start1] < array[start2])
            temp[index++] = array[start1++];
        else
            temp[index++] = array[start2++];
    }

    while(start1 <= end1)
        temp[index++] = array[start1++];

    while(start2 <= end2)
        temp[index++] = array[start2++];

}

void MergeSort(int *array, int *temp, int left, int right)
{
    if(left < right)
    {
        int mid = (left+right)/2;
        MergeSort(array, temp, left, mid);
        MergeSort(array, temp, mid+1, right);

        Merge(array, temp, left, mid, right);
        memcpy(array+left, temp+left, (right-left+1)*sizeof(array[0])); //递归到一组只有一个元素后合并,归并一次写一次。
    }
}


void MergeSort(int array[], int size)
{
    assert(array && size > 0);

    int *temp = new int [size]; //开辟一块辅助内存

    MergeSort(array, temp, 0, size-1);

    delete [] temp;
}

非递归算法:
这里写图片描述

代码实现:

void Merge(int array[], int *temp, int left, int mid, int right)
{
    int start1 = left;
    int end1 = mid;

    int start2 = mid+1;
    int end2 = right;

    int index = left;
    while(start1 <= end1 && start2 <= end2)
    {
        if(array[start1] < array[start2])
            temp[index++] = array[start1++];
        else
            temp[index++] = array[start2++];
    }

    while(start1 <= end1)
        temp[index++] = array[start1++];

    while(start2 <= end2)
        temp[index++] = array[start2++];

}

void MergeSort(int *array, int *temp, int size )
{
    int gap = 1;  //刚开始是一个元素一个元素合并

    while(gap < size)
    {
        for(int i = 0; i < size; i+=2*gap)  //因为元素合并是一组一组相邻的元素合并的,所以这里要加2gap
        {
            int left = i;
            int mid = left +gap-1;
            int right = mid+gap;
            Merge(array, temp, left,mid, right);
        }
        memcpy(array, temp, size*sizeof(array[0])); //这里是归并一趟完了,整个拷贝。如将整个gap=1归并完了,拷贝
        gap =gap*2;
    }
}


void MergeSort(int array[], int size)
{
    assert(array && size > 0);

    int *temp = new int [size]; //开辟一块辅助内存

    MergeSort(array, temp, size);

    delete [] temp;
}

时间复杂度为O(n*logn),没有最好的情况和最坏的情况,空间复杂度为O(n),是一个稳定的算法。 比较次数与待排序记录的初始化状态无关。
外部排序。磁盘文件排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值