归并排排序C++(递归 好家伙)

归并排序

代码跟着思想走!

归并排序的思想 :
1、首先 确定分界点 数组的中点 mid=l+r>>1
2、其次 将数组递归分开 递归排序 左右
3、最后 进行归并 合二为一

记得 这里是很多次执行 双指针 判断 合一 然后又和同一层执行完递归的回来的构成双指针 再合一 然后 enen 你懂的 脑补去吧 一直弄到 区间完为止。

具体的代码如下:

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int tmp[N];
int n;
void merge_sort(int l, int r)
{
    if (l >= r)return;
    int mid = r + l >> 1;
    merge_sort(l, mid); merge_sort(mid + 1, r);
    int i = l; int j = mid + 1; int k = 0;
    while (i <= mid && j <= r)
        if (a[i] <= a[j])tmp[k++] = a[i++];
        else tmp[k++] = a[j++];
    while (i <= mid)tmp[k++] = a[i++];
    while (j <= r)tmp[k++] = a[j++];
    for (int i = l, j = 0; i <= r; i++, j++)a[i] = tmp[j];
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)cin >> a[i];
    merge_sort(0, n - 1);
    for (int i = 0; i < n; i++)cout << a[i] << " ";
    return 0;
}

双向递归啊 递归 你就像两个人牵着手 走 走着走着 你说 我先去前面的路口看看 你在这个路口等着我 然后 你就被下一个路口的帅哥拐走了 ....... 双指针去找 指针分别指向左右 两部分 因为先递归的 所以说 左右两边都是排好序的 可以手写一点去推推 双指针去指着左右两边的数组 将其排到一个新的数组中去 其中的一个小细节 是某个数组可能会先指完 又因为是有序的 所以说就可以 将其后面的全部弄到剩下的tmp临时数组 后面 最后再把tmp给搞到原数组中 这也是为了 数组有序做铺垫 总的 来说 感觉 这个 算法 就是 先让小部分变有序 然后 慢慢地 最后全部变有序。

行吧 还是代码跟着思想跑的好 除非你的脑子是计算机

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镜子的分享

感谢老铁支持!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值