归并排序
代码跟着思想走!
归并排序的思想 :
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给搞到原数组中 这也是为了 数组有序做铺垫 总的 来说 感觉 这个 算法 就是 先让小部分变有序 然后 慢慢地 最后全部变有序。
行吧 还是代码跟着思想跑的好 除非你的脑子是计算机