一、题目
说明如何在O(nlgn)的时间内,利用顺序统计树对大小为n的数组中的逆序对(见思考题2-4)进行计数。
二、思考
求逆序数中介绍了使用树状数组或归并排序求逆序对,这里使用顺序统计数。
数组中某个数字s[i]的逆序数是指出现在s[i]之前,但是比s[i]大的数字的个数。
根据顺序统计量的Os_Rank(),每插入到一个元素x后,可以求得在已经出现的元素中,比x大的数字的个数
三、代码
#include <iostream>
using namespace std;
#define BLACK 0
#define RED 1
//顺序统计量树结点结构
struct node
{
int key;
bool color;
node *p;
node *left;
node *right;
int size;//以结点x为根的子树的内部结点的个数,x->key=x->left->key+x->right->key+1
node(node *init, int k):left(init),right(init),p(init),key(k),color(BLACK),size(1){}
};
//顺序统计量树结构
struct Os_Tree
{
node *root;
node *nil;
Os_Tree()
{
nil = new node(NULL, -1);//哨兵结点
root =