归并排序,统计逆序对的个数
归并排序O(n log n)
1 void merge(int A[],int p,int r,int q){ 2 int n1=r-p+1; 3 int n2=q-r; 4 int* L=new int[n1]; 5 int* R=new int[n2]; 6 for(int i=0;i<n1;i++) 7 L[i]=A[p+i]; 8 for(int i=0;i<n2;i++) 9 R[i]=A[r+i+1]; 10 int i=0,j=0; 11 for(int k=p;k<=q;k++){ 12 if(i<n1&&j<n2){ 13 if(L[i]<=R[j]){ 14 A[k]=L[i]; 15 i++; 16 } 17 else{ 18 A[k]=R[j]; 19 j++; 20 } 21 }else if(i>=n1&&j<n2){ 22 A[k]=R[j]; 23 j++; 24 }else if(i<n1&&j>=n2){ 25 A[k]=L[i]; 26 i++; 27 }else break; 28 } 29 delete[] L; 30 delete[] R; 31 } 32 // 33 void mergeSort(int A[],int p,int q){ 34 if(q<=p) return; 35 int r=(p+q)/2; 36 mergeSort(A,p,r); 37 mergeSort(A,r+1,q); 38 merge(A,p,r,q); 39 }
统计逆序对的个数(改动的地方用红色标记)
1 // 2 void merge(int A[],int p,int r,int q,int& count){ 3 int n1=r-p+1; 4 int n2=q-r; 5 int* L=new int[n1]; 6 int* R=new int[n2]; 7 for(int i=0;i<n1;i++) 8 L[i]=A[p+i]; 9 for(int i=0;i<n2;i++) 10 R[i]=A[r+i+1]; 11 int i=0,j=0; 12 for(int k=p;k<=q;k++){ 13 if(i<n1&&j<n2){ 14 if(L[i]<=R[j]){ 15 A[k]=L[i]; 16 i++; 17 } 18 else{ 19 A[k]=R[j]; 20 j++; 21 count=count+(n1-i); 22 } 23 }else if(i>=n1&&j<n2){ 24 A[k]=R[j]; 25 j++; 26 }else if(i<n1&&j>=n2){ 27 A[k]=L[i]; 28 i++; 29 }else break; 30 } 31 delete[] L; 32 delete[] R; 33 } 34 // 35 void mergeSort(int A[],int p,int q,int& count){ 36 if(q<=p) return; 37 int r=(p+q)/2; 38 mergeSort(A,p,r,count); 39 mergeSort(A,r+1,q,count); 40 merge(A,p,r,q,count); 41 }