归并排序求逆序数对。
1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 int high[100010]; 7 int temp[100010]; 8 int angry[100010]; 9 int num; 10 void mergesort(int first,int mid,int last) 11 { 12 int left1=first,right1=mid,left2=mid+1,right2=last; 13 int i=0; 14 while(left1<=right1&&left2<=right2) 15 { 16 if(high[left1]<=high[left2]) 17 { 18 temp[i++]=high[left1++]; 19 } 20 else 21 { 22 temp[i++]=high[left2++]; 23 angry[left2]+=right1-left1+1; 24 num+=right1-left1+1; 25 for(int j=left1; j<=right1; j++) 26 { 27 angry[j]++; 28 } 29 30 } 31 } 32 if(left1>right1) 33 { 34 while(left2<=right2) 35 { 36 temp[i++]=high[left2++]; 37 } 38 } 39 else if(left2>right2) 40 { 41 while(left1<=right1) 42 { 43 temp[i++]=high[left1++]; 44 } 45 } 46 for(int i=0; i<last-first+1; i++) 47 { 48 high[first+i]=temp[i]; 49 } 50 51 } 52 void Sort(int first,int last) 53 { 54 if(first<last) 55 { 56 int mid=(first+last)/2; 57 Sort(first,mid); 58 Sort(mid+1,last); 59 mergesort(first,mid,last); 60 } 61 } 62 int main() 63 { 64 int n; 65 while(scanf("%d",&n)!=EOF) 66 { 67 num=0; 68 for(int i=0; i<n; i++) 69 scanf("%d",&high[i]); 70 Sort(0,n-1); 71 for(int i=0; i<n; i++) 72 { 73 printf("%d ",angry[i]); 74 } 75 cout<<endl; 76 cout<<num<<endl; 77 } 78 79 return 0; 80 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。