归并排序,涉及到易错内容,红色划掉的即为错误的。
博客属于打卡,不喜勿喷,欢迎dai lao纠错
下面是代码,由于题目本身问题,有些数据以long long 初始化
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n; int k;
int q[N]; int tmp[N];
long long merge_sort(int q[], int l,int r)
{
if (l == r)return 0;
int i = l; int j = r;
int mid = (l + r) / 2;
long long count = 0;
count = merge_sort(q, i, mid) + merge_sort(q, mid + 1, r);
while (i <= mid && j <= r)
{
if (q[i] <= q[j])tmp[k++] = q[i++];
else {
tmp[k++] = q[j++];
count += mid - i + 1;
}
}
while (i <= mid)tmp[k++] = q[i++];
while (j <= r)tmp[k++] = q[j++];
for (int i = l, j = 0; i <= r; i++, j++)q[i] = tmp[j];
return count;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)scanf("%d", &q[i]);
printf("%lld", merge_sort(q, 0, n - 1));
return 0;
}