经典题目: 给定一个序列,求其中的逆序对
在归并排序(merge sort)的基础上统计,时间复杂度O(nlogn)
注意使用long long
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <queue>
using namespace std;
///宏定义
const int INF = 10000000;
const int MAXN = 500100;
const int maxn = MAXN;
///全局变量 和 函数
//int T;
int n;
long long A[maxn], T[maxn];
long long cnt;
long long quick_sort(long long *A, long long x, long long y, long long *T)
{
long long cnt = 0;
if(y - x > 1)
{
long long m = x + (y - x) / 2;
long long p = x, q = m, i = x;
long long leftt = quick_sort(A, x, m, T);
long long rigtt = quick_sort(A, m, y, T);
while(p < m || q < y)
{
if(q >= y || (p < m && A[p] <= A[q]))
{
T[i++] = A[p++];
}
else
{
T[i++] = A[q++];
cnt += m - p; //添加这一句即可,其它同归并排序
}
}
for(i = x; i < y; i++)
A[i] = T[i];
cnt += leftt;
cnt += rigtt;
}
return cnt;
}
int main()
{
///变量定义
int i, j;
while(scanf("%d", &n) == 1 && n)
{
for(i = 0; i < n; i++)
scanf("%lld", &A[i]);
printf("%lld\n", quick_sort(A, 0, n, T));
}
///结束
return 0;
}
本文介绍了一种利用归并排序统计序列中逆序对的方法,通过递归拆分序列并在合并过程中计数逆序对,实现O(nlogn)的时间复杂度。
505

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



