您的位置:首页 > 其它

利用归并排序求逆序对

2013-05-07 12:47 162 查看
归并排序原理:

将一个规模为n的问题分解为n个已经排序的子问题(此时每个子问题只有一个数),然后两两进行合并就可以得到原问题的解。

求逆序对事实上就是统计归并排序中位置交换的次数,简单起见,我们可以用一个全局变量m_Count来统计。

代码如下:

int m_Count=0;

void merge(int* a,int begin,int temp,int end)

{

int first =begin;

int *b=new int[end-begin+1];

for(int i=0;i<=end-begin;i++)

{

b[i]=0;

}

int j=temp+1,t=0;

while(begin<=temp)

{

if (a[begin]>a[j])

{

m_Count += temp-begin+1;//此步即在统计逆序对的个数

b[t++]=a[j];

if (j<end)

{

j++;

}

else

{

j++;

break;

}

}

else

{

b[t++]=a[begin++];

}

}

for(;begin<=temp;begin++)

{

b[t++]=a[begin];

}

for(;j<=end;j++)

{

b[t++]=a[j];

}

for(int i=first;i<=end;i++)

{

a[i]=b[i-first];

}

delete []b;

return;

}

void mergesort(int* a,int begin,int end)

{

if (begin<end)

{

int temp=begin+(end-begin)/2;

mergesort(a,begin,temp);

mergesort(a,temp+1,end);

merge(a,begin,temp,end);

}

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: