在归并排序的基础上添加几行代码就可以解决了,对比另一篇归并排序的代码:https://blog.csdn.net/weixin_40804971/article/details/84889575
区别:为了统计逆序对,需要先将大值放进temp数组,另一篇里的归并排序是先将小值放进temp数组
#include <iostream>
using namespace std;
int invertPair = 0; //牛客上的题要把int改成long long
void merge(int array1[], int first, int last){
int mid = (first + last) / 2;
int i1 = last - first;
int i2 = mid;
int i3 = last;
int temp[last - first + 1];
//左子数组和右子数组都包含元素
while(i2 >= first && i3 >= mid + 1){
if(array1[i2] < array1[i3])
temp[i1--] = array1[i3--];
else{
invertPair += i3 - mid; //统计逆序对的个数
temp[i1--] = array1[i2--];
}
}
//将array1中的剩余元素导入temp,注意两个while条件中的等号
while(i2 >= first)
temp[i1--] = array1[i2--];
while(i3 >= mid + 1)
temp[i1--] = array1[i3--];
//将temp中的内容导入array1,注意array1和temp的索引要分开处理
for(int i = first, j = 0; i <= last; ++i, ++j)
array1[i] = temp[j];
}
void mergeSort(int data[], int first, int last){
if(first < last){
int mid = (first + last) / 2;
mergeSort(data, first, mid);
mergeSort(data, mid + 1, last);
merge(data, first, last);
}
}
int main(){
int data[] = {1, 6, 10, 12, 5, 9, 11, 13};
mergeSort(data, 0, 7);
for(auto i : data)
cout<<i<<" ";
cout<<"\n";
cout<<invertPair; //输出6
return 0;
}