統計陣列中的逆序對
阿新 • • 發佈:2018-12-09
在歸併排序的基礎上新增幾行程式碼就可以解決了,對比另一篇歸併排序的程式碼: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;
}