一个无序序列,找出其中的逆序对。要求时间复杂度为O(nlogn)。
#include <stdio.h>
#define N 5
int count = 0;
void merge_inverse(int numbers[], int p, int q, int r, int *num);
void merge_and_count(int numbers[], int p, int r);
int main(void){
int numbers[N], i;
printf("Please input %d integers:", N);
for (i = 0; i < N; i++)
scanf("%d", &numbers[i]);
merge_and_count(numbers, 0, N-1);
printf("The count of inverse is: %d\n", count);
return 0;
}
void merge_and_count(int numbers[], int p, int r){
if (p < r){
int q = (p + r) / 2;
merge_and_count(numbers, p, q);
merge_and_count(numbers, q + 1, r);
merge_inverse(numbers, p, q, r, &count);
}
}
void merge_inverse(int numbers[], int p, int q, int r, int *num){
int i, j, k;
int l_n = q - p + 1;
int r_n = r - q;
int Left[l_n], Right[r_n];
for (i = 0; i < l_n; i++)
Left[i] = numbers[p + i];
for (i = 0; i < r_n; i++)
Right[i] = numbers[q + 1 + i];
for (i = j = 0, k = p; i < l_n || j < r_n; ){
if (i >= l_n)
numbers[k++] = Right[j++];
else if(j >= r_n)
numbers[k++] = Left[i++];
else if(Left[i] <= Right[j])
numbers[k++] = Left[i++];
else{
numbers[k++] = Right[j++];
*num += l_n - i;
}
}
}