经典排序算法的汇总之归并排序
归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序
void Mymerge(int *a ,int *b ,int na,int nb)
{
int c[20]= {0};
int ic=0,ia=0, ib=0; //三个数组的下标
while(ia<na&&ib<nb)
{
if(a[ia]>b[ib])
{
c[ic]=b[ib++];
ic++ ;
}
else
{
c[ic]= a[ia++];
ic++;
}
}
if(ib<nb) //把剩余的数放入c
{
while( ib<nb)
{
c[ic++]=b[ib++];
}
}
else if(ia<na)
{
while( ia<na)
{
c[ic++]=a[ia++];
}
}
//把c重新赋值给a ,b 数组
ic=0,ia=0, ib=0;
while(ia <na)
{
a[ia++]=c[ic++] ;
}
while(ib<nb)
{
b[ib++]=c[ic++];
}
}
//
int cnt; //逆序对的个数
void merge(int a[] ,int left ,int mid,int right) //ok
{
int c[20]= {0};
int ic=0,ia=left, ib=mid+1; //三个数组的下标
while(ia<=mid&&ib<=right)
{
if(a[ia]>a[ib])
{
//小的在左边 逆序 左边剩余都比现在右边出来的大 都是逆序
cnt+= mid-ia+1;
c[ic]=a[ib++];
ic++ ;
}
else
{
c[ic]= a[ia++];
ic++;
}
}
if(ib<=right) //把剩余的数放入c
{
while( ib<=right)
{
c[ic++]=a[ib++];
}
}
else if(ia<=mid)
{
while(ia<=mid)
{
c[ic++]=a[ia++];
}
}
//把c重新赋值给a 数组
ic=0,ia=left;
while(ia<=right)
{
a[ia++]=c[ic++];
}
cout<<cnt<<endl;
// show(a,4);
}
void mergesort(int a[],int l ,int r)
{
int c[20]={0};
if(l<r)
{
int m=(l+r)/2;
mergesort(a,l,m );
mergesort(a,m+1,r);
merge(a,l,m,r);
}
}