(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];  } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值