# poj 1007:DNA Sorting（水题，字符串逆序数排序）

DNA Sorting
 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 80832 Accepted: 32533

Description

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```

Source

水题，字符串排序
题意：给你m个长度为n的字符串，要求让你按照字符串的逆序数进行稳定排序。
所谓逆序数，就是给定一个排列和一个标准次序，如果这个排列中有两个元素与标准次序不同，则称这是一个逆序，这个排列的所有逆序总数称为这个排列的逆序数。
思路：定义一个结构体存储字符串和字符串的逆序数，在主程序里，输入字符串之后计算每一个字符串的逆序数。然后用sort进行排序，最后输出排序后的字符串。
代码
``` 1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4 struct Str{
5     char s;
6     int n;  //逆序数个数
7 };
8 bool cmp(const Str &a,const Str &b)
9 {
10     if(a.n<b.n)
11         return 1;
12     return 0;
13 }
14 int main()
15 {
16     int n,m,i,j;
17     Str str;
18     while(cin>>n>>m){
19         for(i=1;i<=m;i++)   //输入
20             cin>>str[i].s;
21         for(i=1;i<=m;i++){
22             int num=0;
23             int A=0,C=0,G=0;
24             for(j=n-1;j>=0;j--){
25                 switch(str[i].s[j]){    //计算逆序数
26                     case 'A':A++;break;
27                     case 'C':C++;num+=A;break;
28                     case 'G':G++;num+=A;num+=C;break;
29                     case 'T':num+=A;num+=C;num+=G;break;
30                     default:break;
31                 }
32             }
33             str[i].n = num;
34         }
35         sort(str+1,str+m+1,cmp);
36         for(i=1;i<=m;i++)
37             cout<<str[i].s<<endl;
38     }
39     return 0;
40 }```

Freecode : www.cnblogs.com/yym2013

##原创声明 **转载请注明：[呓语](http://www.yangyingming.com) » [poj 1007:DNA Sorting（水题，字符串逆序数排序）](http://www.yangyingming.com/article/82)**