(2)J - 归并排序求逆序对

One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).

You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
Sample Output
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
题意:输入n,m,有m行n个DNA,按逆序从小到,大输出,(EAG)E比A大比G小,故只有逆序为1,思路:归并排序我不理解,一开始只会冒泡求,但后来找到才理解一点
 
 
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; void mergesort(char x[],int begin,int end,int num); void merge(char x[],int begin,int mid,int end,int num); struct node {  char a[52];  char b[52];  int sum; }mp[110]; char temp[52]; bool cmp(node x,node y) {  return x.sum<y.sum; } int main() {  int n,m,i,j;
 cin>>n>>m;  for(i=1;i<=m;i++)  {   cin>>mp[i].a;   mp[i].sum=0;   strcpy(mp[i].b,mp[i].a);   mergesort(mp[i].b,0,n-1,i);  }  sort(mp+1,mp+1+m,cmp);  for(i=1;i<=m;i++)  {   cout<<mp[i].a<<endl;  } } void mergesort(char x[],int begin,int end,int num) {  int mid;  if(begin<end)  {   mid=(begin+end)/2;   mergesort(x,begin,mid,num);   mergesort(x,mid+1,end,num);   merge(x,begin,mid,end,num);  } } void merge(char x[],int begin,int mid,int end,int num) {  int i,j,k=0;  i=begin,j=mid+1;  while(i<=mid&&j<=end)  {   if(x[i]<=x[j])   {    temp[k++]=x[i++];   }   else   {    mp[num].sum+=mid-i+1;    temp[k++]=x[j++];   }  }  while(i<=mid)  {   temp[k++]=x[i++];  }  while(j<=end)  {   temp[k++]=x[j++];  }  for(i=0;i<k;i++)  {   x[begin+i]=temp[i];  } }

猜你喜欢

转载自blog.csdn.net/whhhzs/article/details/79246803