| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 573 人关注过本帖
标题:算法问题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
快速回复:算法问题3
数据加载中...
 
   



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

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