归并排序和逆序对数量
归并排序
#包括牡蛎
使用命名空间标准;
常量整数N=100010
int q[N];
int tmp[N];
void merge_sort(int q[],int l,int r)
{
if(l=r)返回;
int mid=l r 1;
merge_sort(q,l,mid);
merge_sort(q,mid 1,r);
int k=0,i=l,j=mid 1;
而(我=中间j=r)
if(q[I]=q[j])tmp[k]=q[I];
else tmp[k]=q[j];
而(I=mid)tmp[k]=q[I];
而(j=r)tmp[k]=q[j];
对于(i=l,j=0;I=r;I,j)q[I]=tmp[j];
}
int main()
{
int n;
scanf('%d ',n);
for(int I=0;I n;(一)
{
scanf('%d ',q[I]);
}
merge_sort(q,0,n-1);
for(int I=0;I n;(一)
{
printf('%d ',q[I]);
}
}
1.先找中间的点,与快排不一样的是,他要求是位置在中间
2.分成左右两边,归并处理左右两边
3.归并排序,将左右两个有序序列合并成一个有序的序列
逆序对数量
#包含输入输出流
#包含cstring
#包含算法
使用命名空间标准;
typedef长长LL;
常量整数N=100010
int q[N],tmp[N];
LL merge_sort(int q[],int l,int r){ 0
if(l=r)返回0;
int mid=r l 1;
LL res=merge_sort(q,l,mid) merge_sort(q,mid 1,r);
int k=0,i=l,j=mid 1;
而(i=中间j=r)
{
if(q[I]=q[j])tmp[k]=q[I];
其他
{
res=中一1;
tmp[k]=q[j];
}
}
而(I=mid)tmp[k]=q[I];
而(j=r)tmp[k]=q[j];
对于(i=l,j=0;I=r;I,j)q[I]=tmp[j];
返回表示留数
}
int main()
{
int n;
scanf('%d ',n);
for(int I=0;I n;(一)
{
scanf('%d ',q[I]);
}
cout merge_sort(q,0,n-1);
返回0;
}
会产生逆序对只会在中间的的左右两边时,此时若我的值大于j的值,那么我后面的数的值必然会大于j的值。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/70025.html