您的位置:首页 > 其它

题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目

2013-01-25 15:41 543 查看
题目:

        给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。

前提:

        1.不考虑超大数据等特殊情况

代码:     

#include<iostream>
using namespace std;
int CountInverseNumber(int a[],int p,int r);
int merge_sort(int a[],int p,int r);
int merge(int a[],int p,int q,int r);

int main()
{
//测试数据
int a[11]={1,49,60,12,-12,101,121,62,60,8,-100};
int len=sizeof(a)/sizeof(a[0]);
cout<<"result:"<<CountInverseNumber(a,0,len-1)<<endl;
return 0;
}

//业务方法
int CountInverseNumber(int a[],int p,int r)
{
return merge_sort(a,p,r);
}

//改写归并排序算法,使之在合并的时候能够获逆序数。
int merge_sort(int a[],int p,int r)
{
int sum=0;
int left=0;
int right=0;
int q=0;
if(p<r)
{
q=(p+r)/2;//拆分待排序元素
left=merge_sort(a,p,q);//获取左侧子序列的逆序数
right=merge_sort(a,q+1,r);//获取右侧子序列的逆序数
sum=merge(a,p,q,r);//左、右子序列合并在一起时,子序列的逆序已经数好,这里要数剩余的那些逆序对的数量。
}
return sum+left+right;
}

int merge(int a[],int p,int q,int r)
{
int n=0;
int b_index=0;
//
int i=q,j=r;
for(int k=r;k>=q+1;k--)
{
for(int h=q;h>=p;h--)
{
if(a[k]<a[h])
{
n++;
}
}
}
return n;
}

总结:

        本算法采用了分治的思想,改写了原先写好的归并/合并排序。在每次“合并”的时候,分别拿出右侧子序列中的元素,到左侧子序列中比较来得出部分逆序数。之后,再把三个部分的逆序数加在一起。与归并/合并排序类似,都是树形结构,故不难看出时间复杂度为O(nlgn)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 练习
相关文章推荐