void mergeSort(int *data,int* copy,int start,int end)
{// copy 数组变为有序的
if(start>end) return ;
if(start==end) {
copy[start]=data[start];
return ;
}
int mid=(start+end)/2;
mergeSort(copy,data,start,mid);
mergeSort(copy,data,mid+1,end);
//merge int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end)
copy[k++]=data[i]<data[j]?data[i++]:data[j++];
while(i<=mid)
copy[k++]=data[i++];
while(j<=end)
copy[k++]=data[j++];
return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
int data[5]={3,6,2,5,0};
int copy[5]={3,6,2,5,0};
mergeSort(data,copy,0,4);
getchar();
return 0;
}
归并排序计算逆序数
int countInversePairs(int* data,int* copy,int start,int end)
{
// copy is
if(start>end) return 0;
if(start==end){
copy[start]=data[start];
return 0;
}
int mid=(start+end)/2;
int left=countInversePairs(copy,data,start,mid);
int right=countInversePairs(copy,data,mid+1,end);
int count=0;
int i=mid,j=end,k=end;
while(i>=start&&j>=mid+1)
{
if(data[i]>data[j]){
count+=j-mid;
copy[k--]=data[i--];
}
else{
copy[k--]=data[j--];
}
}
while(i>=start)
copy[k--]=data[i--];
while(j>=mid+1)
copy[k--]=data[j--];
return count+left+right;
}
int _tmain(int argc, _TCHAR* argv[])
{
int data[5]={3,6,2,5,0};
int copy[5]={3,6,2,5,0};
int result=countInversePairs(data,copy,0,4);
getchar();
return 0;
}