DNA SORT(求逆序数)
1 #include <iostream> 2 #include <string.h> 3 //#include <fstream> 4 5 using namespace std; 6 7 static int ans=0; 8 9 void swap(int& a,int& b) 10 { 11 int t; 12 t=a; 13 a=b; 14 b=t; 15 } 16 17 void swap(char*a ,char*b ) 18 { 19 char s[55]; 20 strcpy(s,a); 21 strcpy(a,b); 22 strcpy(b,s); 23 } 24 25 int mergesort(char*a,char* t,int x,int y) 26 { 27 28 if(y-x>1) 29 { 30 int m=x+(y-x)/2; 31 int p=x,i=x,q=m; 32 mergesort(a,t,x,m); 33 mergesort(a,t,m,y); 34 35 while(p<m||q<y) 36 { 37 if(q>=y||(p<m&&(a[p]<=a[q]))) 38 { 39 t[i++]=a[p++]; 40 } 41 else 42 { 43 t[i++]=a[q++]; 44 ans+=m-p;//对于左边每一个数,右边还没来得及复制的数就是对应的逆序数 45 } 46 } 47 48 for(i=x;i<y;i++) 49 { 50 a[i]=t[i]; 51 } 52 53 } 54 55 return ans; 56 } 57 58 59 int main() 60 { 61 //ifstream fin; 62 //fin.open("ss.txt"); 63 int n,m; 64 cin>>n>>m; 65 char str[105][55]; 66 char t[55]; 67 int c[105]={0}; 68 69 for(int i=0;i<m;i++) 70 { 71 for(int j=0;j<n;j++) 72 { 73 cin>>str[i][j]; 74 } 75 ans=0; 76 char s[55]; 77 strcpy(s,str[i]); 78 c[i]=mergesort(s,t,0,n); 79 } 80 81 for(int i=m-1;i>0;i--) 82 { 83 for(int j=0;j<i;j++) 84 { 85 if(c[j]>c[j+1]) 86 { 87 swap(c[j],c[j+1]); 88 swap(str[j],str[j+1]); 89 } 90 } 91 } 92 93 for(int i=0;i<m;i++) 94 { 95 for(int j=0;j<n;j++) 96 cout<<str[i][j]; 97 cout<<endl; 98 } 99 100 return 0; 101 }