1. 程式人生 > >統計陣列中的逆序對

統計陣列中的逆序對

在歸併排序的基礎上新增幾行程式碼就可以解決了,對比另一篇歸併排序的程式碼: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; }