归并排序求逆序数
2011-10-27 14:11
369 查看
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int cnt;
void mergesort(int i,int j,int *a,int *b)
{
if(j-i>1)
{
int m=(i+j)/2;
mergesort(i,m,a,b);
mergesort(m,j,a,b);
int p=i,q=m,l=i;
while(p<m||q<j)
{
if(q>=j||(p<m&&a[p]<=a[q])) b[l++]=a[p++];
else { b[l++]=a[q++]; cnt+=m-p;}
}
for(int k=i;k<j;k++)
a[k]=b[k];
}
}
int main ()
{
int a[10]={5,8,7,9,1,2,3,0,6,4};
int b[10];
cnt=0;
mergesort(0,10,a,b);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
cout<<endl<<"cnt="<<cnt;
return 0;
}
#include <cstdio>
#include <cstring>
using namespace std;
int cnt;
void mergesort(int i,int j,int *a,int *b)
{
if(j-i>1)
{
int m=(i+j)/2;
mergesort(i,m,a,b);
mergesort(m,j,a,b);
int p=i,q=m,l=i;
while(p<m||q<j)
{
if(q>=j||(p<m&&a[p]<=a[q])) b[l++]=a[p++];
else { b[l++]=a[q++]; cnt+=m-p;}
}
for(int k=i;k<j;k++)
a[k]=b[k];
}
}
int main ()
{
int a[10]={5,8,7,9,1,2,3,0,6,4};
int b[10];
cnt=0;
mergesort(0,10,a,b);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
cout<<endl<<"cnt="<<cnt;
return 0;
}
相关文章推荐
- [CODEVS3324]新斯诺克(归并排序求逆序对)
- 求逆序对数总结 & 归并排序
- 归并排序-数组中的逆序对
- POJ1007_DNA Sorting_归并排序求逆序对
- 逆序对 (归并排序)
- HDU 4911 Inversion【归并排序求逆序数】
- SDUT 3317 反演 归并排序 求逆序数
- 有关归并排序和逆序对
- noip2013 火柴排队 (离散化+归并排序求逆序对数)
- 求逆序对数的NLogN解法:归并排序、树状数组和线段树
- 洛谷P1908 逆序对(归并排序)
- 归并排序实现求逆序数
- 逆序对数(归并排序)
- 【逆序对】归并排序,你需对
- #1141 : 二分·归并排序之逆序对
- hiho一下 第三十九周 #1141 : 二分·归并排序之逆序对 【归并排序----树状数组】
- Ultra-QuickSort(归并排序求逆序对的个数)
- POJ_2299_Ultra-quicksort_归并排序、逆序数
- 归并排序求逆序对
- POJ 0809 求逆序对数(归并排序求逆序数)