#include<iostream>
using namespace std;
void merge(int *arr,int left,int mid,int rig,int *count);
void mergesort(int *arr,int left,int rig,int *count);
int main(){
int n;
cin>>n;
int count=0;
int arr[n];
for(int i=0;i<n;++i){
cin>>arr[i];
}
mergesort(arr,0,n-1,&count);
cout<<count;
return 0;
}
void merge(int *arr,int left,int mid,int rig,int *count){
// 两个子序列本身是有序的,
int p1=left;
// [left,mid],[mid+1,rig]
int p2=mid+1;
// 输出数组开辟空间
int len=rig-left+1;
int *tem=new int[rig-left+1];
int cnt=0;
// 对两个数组两两元素比较大小,放在输出数组中
while(p1<=mid && p2<=rig){
if(arr[p1]<arr[p2]){
tem[cnt++]=arr[p1++];
*count+=(p1-cnt);
}
else{
tem[cnt++]=arr[p2++];
*count+=(p2-cnt);
}
}
// 跳出以上while循环时,只能代表一个子数组输出完了,另一个不一定,因此还需要继续输出。
while(p1<=mid){
tem[cnt++]=arr[p1++];
}
while(p2<=rig){
tem[cnt++]=arr[p2++];
}
// 将输出数组的值复制到原数组中
for(int k=0;k<len;++k){
arr[left+k]=tem[k];
}
}
void mergesort(int *arr,int left,int rig,int*count){
// 递归结束条件
if(left>=rig){
return ;
}
int mid=left+(rig-left)/2;
// 对该数列的子序列先进行递归操作,
mergesort(arr,left,mid,count);
mergesort(arr,mid+1,rig,count);
// 当递归结束时,需要处理数组的两个子数组已经是有序数组了,再进行最后一次merge
merge(arr,left,mid,rig,count);
}
归并排序代码注释
最新推荐文章于 2024-08-08 15:12:59 发布