1 直接想法,遍历数组,每访问一个数就和后面的作比较,若有逆序对,则数量加1;时间复杂度o(n*n)
代码:
int InversePairs(vector<int> data) {
int number=0;
if(data.size()<=0)
return 0;
for(int i=0;i<data.size();i++){
for(int j=i+1;j<data.size();j++){
if(data[j]<data[i])
number++;
}
}
return number;
}
2 归并排序的思想
int InversePairs(vector<int> data) {
if(data.size()<=0)
return 0;
vector<int> copy(data.begin(),data.end());
int result=MergeSort(data,copy,0,data.size()-1);
return result;
}
//归并排序
int MergeSort(vector<int> &data,vector<int> ©,int start,int end){
if(start==end){
copy[start]=data[start];
return 0;
}
int mid=(start+end)/2;
//将数组传递换序,可以减少数组的拷贝
int left=MergeSort(copy,data,start,mid);
int right=MergeSort(copy,data,mid+1,end);
int count=0;
int index=end;
int i=mid;
int j=end;
while(i>=start && j>=mid+1){
if(data[j]<data[i]){
count += j-mid;
copy[index]=data[i--];
}else{
copy[index]=data[j--];
}
index--;
}
while(i>=start)
copy[index--]=data[i--];
while(j>=mid+1)
copy[index--]=data[j--];
return left+right+count;
}