标题:算法问题3
只看楼主
jtws3000
Rank: 1
等 级:新手上路
帖 子:102
专家分:0
注 册:2006-11-3
 问题点数:0 回复次数:2 
算法问题3

设A[1..n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对。
请给出一个算法,能在O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。

我能给出一个O(n2)的算法(naive),但实在想不出O(nlgn)的算法。

搜索更多相关主题的帖子: 算法 
2007-02-12 11:36
newtonoxen
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-5-12
得分:0 
int c[LEN],d[LEN],summ=0;
void MergeSort(int p, int r)
{
if (p >= r) return ;
int i, j, v, mid = (p + r) >> 1;
MergeSort(p, mid);
MergeSort(mid + 1, r);
i = p; j = mid + 1; v = 0;
while (i <= mid && j <= r) {
if (c[i] > c[j]) {
d[v++] = c[j++];
summ += mid - i + 1; //inversion
}
else d[v++] = c[i++];
}
while (i <= mid) d[v++] = c[i++];
memcpy(c + p, d, v * sizeof(int));
}
借助归并排序可以求你序
2007-02-13 01:40
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
得分:0 
这里(p + r) &gt;&gt; 1,即是(p+r)/2,感得楼上函数有点奇,如果可以麻烦说说它理由。

2007-02-20 11:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-120700-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.937723 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved