/* 题目: 求给定数组的逆序对数。 */ /* 思路: 归并排序。 */ #include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> using namespace std; int merge(int A[], int left,int mid,int right){ int myCount = 0; int p1 = left; int p2 = mid + 1; int temp[right-left+1]; int i = 0; while(p1 <= mid && p2 <= right){ if(A[p1] > A[p2]){ myCount = myCount + 1 + mid - p1;//右边数字大于左边数字的个数。 temp[i] = A[p2]; p2++; }else{ temp[i] = A[p1]; p1++; } i++; } while(p1 <= mid){ temp[i++] = A[p1++]; } while(p2 <= right){ temp[i++] = A[p2++]; } for(int i = left; i <= right; i++){ A[i] = temp[i-left]; } return myCount; } int sort(int A[], int left,int right) { if(left == right){ return 0; } int mid = left + ((right-left) / 2); //cout<<left<<" "<<mid<<" "<<right<<endl; int num1 = sort(A,left,mid); int num2 = sort(A,mid+1,right); return merge(A,left,mid,right) + num1 + num2; } int main(){ int a[] = {1,3,7,2,4,1}; cout<<sort(a,0,5)<<endl; for(int i = 0; i < 6;i++){ cout<<a[i]<<" "; } return 0; }
原文:https://www.cnblogs.com/buaaZhhx/p/12074959.html