逆序对的定义:设A[1…n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion)。
要求给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。
下面是c代码实现,采用合并排序算法。此代码尚未经过优化,仅供参考。
inversion.h
/*
* Caculate the number of inversions in the array
* 求数组中的逆序对的个数
*/
#ifndef _FENGHOU_INVERSION_H_
#define _FENGHOU_INVERSION_H_
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
long calc_inversion(int * array, int length);
#endif /* _FENGHOU_INVERSION_H_ */
inversion.c
#include "inversion.h"
#include <string.h>
int * _calc_inversion_merge_sort(int * array, int length, long * inversion);
int * _calc_inversion_merge(int * array_left, int length_left, int * array_right, int length_right, long * inversion);
void _calc_inversion_print_