归并排序,C语言

归并排序是一种高效、稳定的排序算法,它采用分治法的策略,将问题分解为一些规模较小的相似子问题,递归解决这些子问题,然后合并其结果作为原问题的解。归并排序的核心在于如何将两个有序的数组合并成一个大的有序数组。

#include<stdio.h>
const int N = 100010;
int tmp[N];
void merge_sort(int q[], int l, int r)
{
    if (l >= r)return;
    int mid = l+r>> 1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    int k = 0, i = l, j = mid + 1;//分成两段
    while (i <= mid && j <= r)//注意右边r为下标(如n个数下标为n-1)
    {
        if (q[i] <= q[j])
        {
            tmp[k++] = q[i++];
        }
        else
        {
            tmp[k++] = q[j++];
        }
        //一段tmp[k++]=q[i]<=q[j]?q[i++]:q[j++];
    }
    //当排完两段,若还有剩下的数未接上
    while (i <= mid)tmp[k++] = q[i++];
    while (j <= r)tmp[k++] = q[j++];

    //最后重新将排好的数换给原来的数组
    for (i = l, j = 0; i <= r; i++, j++)q[i] = tmp[j];
    //注意为什么i为l(L的小写),函数中给的就是下标[l,r]的,tmp[],是从k=0开始,所以j=0
}


int main()
{
    int nums[10] = { 9,6,3,7,5,2,4,1,8};
    merge_sort(nums, 0, 9);
    for (int i = 0; i <= 9; i++)
    {
        printf("%d ", nums[i]);
    }
    return 0;
}

运行结果:

算法分析

  • 时间复杂度:归并排序的时间复杂度为 O(nlogn),其中 n 是数组的长度。这是因为每一层递归都需要遍历整个数组(O(n)),而递归的层数为 logn。

  • 空间复杂度:归并排序需要额外的空间来存储临时数组,因此空间复杂度为 O(n)。

  • 稳定性:归并排序是一种稳定的排序算法,因为合并两个数组时,相同元素的相对顺序不会改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值