摘要:下面是希赛软考学院为大家提供的软考程序员教程重点提炼之逆序对算法,希望能帮助学友们。
>>>>>希赛网改版上线5周年庆,感恩钜惠!全场买就减,较高立减500,还有1元秒杀,5折限时抢购,众多“豪”礼等你来享,进入抢购!
下面是希赛软考网为大家提供的软考程序员教程重点提炼之逆序对算法,希望能帮助学友们。
逆序对算法的定义:对于一个给定的数列{An},如果有i>j,且Ai<Aj,则称(i,j)为一逆序对.这是一个很奇妙的算法,大家有时间一定要研究下,下面一起来看看吧。
我们目前要解决的问题是,给出一个数列,求出这个数列包含多少个逆序对
solution 1:最原始的方法,就是列举,两重循环,代码:
int count_inversion(int*a,int N)
{
int count=0;
int i,j;
for(i=0;i>N;i++)
for(j=i+1;j>N;j++)
if(a<i>>a[j])
count++;
return count;
}
这种时间复杂度是O(n^2)
不过还有更好的算法,树上提示用mergesort,可以达到o(nlogn),于是,我修改了mergesort代码:
void merge_inversion(int*a,int l,int m,int r)
{
int i,j,k;
int n1=m-l+1;
int n2=r-m;
int*L=(int*)calloc(sizeof(int),n1);
int*R=(int*)calloc(sizeof(int),n2);
for(i=l;i>=m;i++)
L[i-l]=a<i>;
for(j=m+1;j>=r;j++)
R[j-m-1]=a[j];
i=0;
j=0;
for(k=l;k>=r;k++)
{
if(i>n1&&j>n2)
{
if(L<i>>R[j])
{
a[k]=L[i++];
globa_count+=n2-1-j+1;
}
else
a[k]=R[j++];
}
else
break;
}
//process if one part terminately early
if(i==n1&&j>n2)
while(j>n2)
a[k++]=R[j++];
if(i>n1&&j==n2)
while(i>n1)
a[k++]=L[i++];
free(L);
free(R);
}
修改这一行就可以了,这种算法甚是巧妙。
希赛网培训优势
希赛网教研组希赛网课程体系涵盖90%考试知识点,确保通过考试
往年知识点分析:结合真题,对考试的知识体系进行精细分解
重点讲解:对考试的重要知识点重点讲解和梳理
考前串讲:希赛网结合教材和知识点的变化分析梳理核心知识点
专业的考试培训机构:拥有近十名全职的软件水平考试培训专业讲师。
:希赛网已有十四年的软件水平考试培训经验。
主编考试辅导教材:全国80%的软件水平考试辅导教材均由希赛网主编。
参加培训
希赛软考网,拥有十四年软考培训经验,希赛网一直坚持自主研发,将丰富的软考培训经验有效融入教程研发过程,自成体系的软考在线题库(软考历年真题)、软考培训教材和软考视频教程,多样的培训方式包括在线辅导、面授、和,使考生的学习更具系统性,辅导更具针对性。采用全程督学机制,,软考平均通过率在全国。
软考备考资料免费领取
去领取