仅供大家参考c语言逆序对(因为在csdn上没有看见c语言版的特总结一份):
#include <stdio.h>
int nums[50000];
int temp[50000];//用来拷贝
long long ans = 0;
void _merge(int low, int high, int mid) {
int l = low;
int r = mid + 1;
int k = low;
while (l <= mid && r <= high) {
if (nums[l] > nums[r]) {
temp[k++] = nums[r++];
ans += (mid + 1 - l); //l大于后列的nums[r],那么l后面的元素均大于nums[r],即mid+1-l个
} else {
temp[k++] = nums[l++];
}
}
while (l <= mid)
temp[k++] = nums[l++];
while (r <= high)
temp[k++] = nums[r++];
for (int i = low; i <= high; i++) {
nums[i] = temp[i];
}
}
void mergeSort(int low, int high) {
int mid;
if (low >= high)
return;
mid = low + (high - low) / 2;
mergeSort(low, mid);
mergeSort(mid + 1, high);
_merge(low, high, mid);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
mergeSort(0, n - 1);
printf("%lld", ans);
}