归并排序求逆序数
#include <stdio.h> #include <string.h> using namespace std; const int mm = 1009; int f[mm],nCount; void Merge(int l,int mid1,int mid2,int r,int*f) { int t[mm],pos = 0,i=l,j=mid2; while(i <= mid1 && j <= r) { if(f[i]<=f[j]) t[pos++] = f[i++]; else { t[pos++] = f[j++]; //i位后的都比f[j] 大 nCount += mid1-i+1;//j-mid2+1; } } while(i <= mid1) t[pos++] = f[i++]; while(j <= r) t[pos++] = f[j++]; for(int i=0;i<pos;++i) f[l+i] = t[i]; } void MergeSort(int l,int r,int*f) { int mid = (l+r)/2; if(l == r) return; MergeSort(l,mid,f); MergeSort(mid+1,r,f); Merge(l,mid,mid+1,r,f); } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<n;++i) scanf("%d",&f[i]); nCount = 0; MergeSort(0,n-1,f); printf("ni: %d\n",nCount); for(int i=0;i<n;++i) printf("%d ",f[i]); putchar('\n'); } return 0; }
The article write by nealgavin