给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏情况需要O(nlgn)时间
#include <cstdio>
#include <cstdlib>
#include <cstring>
int calculate(int *num, int l, int r) {
if (l >= r) return 0;
int total = 0, mid = (l + r) >> 1;
total += calculate(num, l, mid);
total += calculate(num, mid + 1, r);
//每个子规模 暴力求
for (int i = l; i <= mid; i++) {
for (int j = mid + 1; j <= r; j++) {
total += num[i] > num[j];
}
}
return total;
}
int main() {
int num[5] = {2, 3, 8, 6, 1};
int total = calculate(num, 0, 4);
printf("total: %d\n", total);
return 0;
}
看到这个题的时候这个方法在脑海一闪而过,以为这个时间复杂度至少是O(n^2)的,之后在白板上画了画才发现居然是(n + 1/2*n)*lgn的。