思路
归并排序本质上是一个充分体现分治和回溯的排序算法
大概思路就是先分,在捏一块
例如:
初始数组:[1, 3, 3, 18, 23, 81, 2]
Step 1: 划分数组成单个元素的子数组
[1] [3] [3] [18] [23] [81] [2]
Step 2: 合并相邻的子数组并排序
[1, 3] [3, 18] [23, 81] [2]
Step 3: 合并相邻的子数组并排序
[1, 3, 3, 18] [2, 23, 81]
Step 4: 最终合并并排序
[1, 2, 3, 3, 18, 23, 81]
总之就这几个步骤
上代码!
代码
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int b[100010];
void merge(int l, int r)
{
if (l == r) return;
int mid = (l + r) / 2;
merge(l, mid);
merge(mid + 1, r);
int i = l, j = mid + 1;
int tot = l;
while (i <= mid && j <= r)
{
if (a[i] < a[j])
{
b[tot++] = a[i];
i++;
}
else
{
b[tot++] = a[j];
j++;
}
}
while (i <= mid) b[tot++] = a[i++];
while (j <= r) b[tot++] = a[j++];
for (int i = l; i <= r; i++)
{
a[i] = b[i];
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
merge(0, n-1);
for (int i = 0; i < n; i++)
{
cout << a[i] << ' ';
}
return 0;
}
易错点
这个归并排序思路上挺简单的,但是实现的时候有些地方还是有坑的
比如在这个点:
while (i <= mid && j <= r)
//这个位置的条件非常重要,如果是用这个排序写逆序对和普通排序的话,写错了就会导致一些问题
这个位置十分的关键,少了这部分,就只有分没有和了
三个while是用来排序(和)
563

被折叠的 条评论
为什么被折叠?



