归并排序
输入样例
5
3 1 2 4 5
输出样例
1 2 3 4 5
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
int q[N], ans[N];
void merge_sort(int q[],int l,int r)
{
if (l == r)
return;
int mid = (l + r) / 2;
merge_sort(q, l, mid);//递归处理左端
merge_sort(q, mid + 1, r);//递归处理右端
int cnt = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)//把较小的元素放到另一个数组
{
if (q[i] <= q[j])
ans[cnt++] = q[i++];
else
ans[cnt++] = q[j++];
}
while (i <= mid)//把剩余元素存到临时数组
ans[cnt++] = q[i++];
while (j <= r)
ans[cnt++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)//复制到原始数组
q[i] = ans[j];
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
merge_sort(q, 0, n-1);
for (int i = 0; i < n; i++)
printf("%d ", q[i]);
return 0;
}
逆序对的数量
输入样例
6
2 3 4 5 6 1
输出样例
5
代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int q[N], temp[N];
LL merge_sort(int l,int r)
{
if (l == r)
return 0;
int mid = l + r >> 1;
/*计算未跨区间的逆序对的数量*/
LL res=merge_sort(l, mid)+merge_sort(mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
{
if (q[i] <= q[j])
temp[k++] = q[i++];
else
{
temp[k++] = q[j++];
res += mid - i + 1;//这个数之后的所有数都符合逆序对
}
}
while (i <= mid)//将剩余元素存到临时数组
temp[k++] = q[i++];
while (j <= r)
temp[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)//复制到原始数组
q[i] = temp[j];
return res;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
cout << merge_sort(0, n - 1) << endl;
return 0;
}