7-2 求逆序对数目 (20分) 归并排序 O(nlogn)

输入样例:

在这里给出一组输入。例如:

 6
-42 23 6 28 -100 65537

输出样例:

在这里给出相应的输出。例如:

5

 

#include <iostream>
using namespace std;
int count=0;
//合并两个有序线性表 (两个线性表在一个线性表内)== 给数组 A 排序
void Merge(int A[],int low,int mid,int high ){
int B[1000];
int i,j,k;

for(k=low;k<=high;k++){ //复制A到B中
B[k]=A[k];
}

for(i=low,j=mid+1,k=i;i<=mid && j<=high ;k++){ //在B数组中分两段 按顺序两两比较 选取较小的给A数组
if(B[i]<=B[j]) A[k]=B[i++];
else
{
A[k]=B[j++];
count=count+(mid-i+1); // 计算逆序
}
}

while(i<=mid){
A[k++]=B[i++];
}
while(j<=high){
A[k++]=B[j++];
}
}

void MergeSort(int A[],int low ,int high){ // 算法 MergeSort 的递归过程只是将待排集合一分为二,直至待排序列只剩下一个元素为止
if(low<high){
int mid = (low+high)/2;
MergeSort(A,low,mid);
MergeSort(A,mid+1,high);
Merge(A,low,mid,high);
}
}

int main(){
int n;
cin>>n;
int A[1000];
for(int i=0;i<n;i++){
cin>>A[i];
}
MergeSort(A,0,n-1);
cout<<count<<endl;
return 0;
}

posted @ 2020-09-28 16:15  吹梦西洲  阅读(547)  评论(0编辑  收藏  举报