Ultra-QuickSort
参考:逆序数算法
//归并排序+逆序数的数量(相邻逆序数)
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=5e5+10;
ll n,ans;
ll a[N], aux[N];
void merge(ll a[], ll l, ll r, ll mid) {
ll i, j, k;
for (k = l;k <= r;k++) aux[k - l] = a[k];//将 a 的区间元素复制到 aux 一份,以便将 a 的原区间元素覆盖实现排序
i = l;j = mid + 1;
for (k = l;k <= r;k++) {
if (i > mid) {
a[k] = aux[j - l];j++;//右边的大数多,此时没有逆序数
}
else if (j > r) {
a[k] = aux[i - l];i++;//左边的大数多,有逆序数
//ans+=mid-i+1;//这里并不需要?
}
else if (aux[i - l] > aux[j - l]) {//发现逆序数
a[k] = aux[j - l];j++;
ans+=mid-i+1;
}
else {//非逆序数
a[k] = aux[i - l];i++;
}
}
}
void merge_sort(ll a[], ll l, ll r) {
if (l >= r) return;
int mid = (l + r) / 2;
merge_sort(a, l, mid);
merge_sort(a, mid + 1, r);
merge(a, l, r, mid);
}
void mergesort(ll a[], ll l, ll r) {
merge_sort(a, l, r - 1);
}
int main() {
while (cin >> n && n) {
ans=0;
for (ll i = 0;i < n;i++) cin >> a[i];
mergesort(a, 0, n);
/*ll k=0;
for(ll i=0;i<n;i++){
cout<<a[i]<<' ';k++;
if(k%5==0) cout<<endl;
}*/
cout<<ans<<endl;
}
return 0;
}
前面我们已经学习了归并排序(转载文章),这里只是在归并排序的基础上加之计数变量即可!
(这里顺便提一句:所有的题目都是要自己写出来 AC 为目的,不要求快,而且要定期复习巩固!)