2012-06-06 07:08:52Morris

[UVA][sort] 612 - DNA Sorting


  DNA Sorting 

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 of the input is an integer M, then a blank line followed by M datasets. There is a blank line between datasets.

The first line of each dataset contains two integers: a positive integer n ( $0 < n le 50$) giving the length of the strings; and a positive integer m ( $0 < m le 100$) giving the number of strings. These are followed by m lines, each containing a string of length n.

Output 

For each dataset, output the list of input strings, arranged from ``most sorted'' to ``least sorted''. If two or more strings are equally sorted, list them in the same order they are in the input file.

Print a blank line between consecutive test cases.

Sample Input 

1

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

Sample Output 

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA


根據DNA未排序程度做排序, 相同則依輸入順序 

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int in, v;
} Order;
int cmp(const void *i, const void *j) {
    Order *a, *b;
    a = (Order *)i, b = (Order *)j;
    if(a->v != b->v)
        return a->v - b->v;
    return a->in - b->in;
}
int main() {
    int t, n, m, i, j, k;
    char dna[101][101];
    scanf("%d", &t);
    while(t--) {
        scanf("%d %d", &m, &n);
        Order D[101];
        for(i = 0; i < n; i++) {
            scanf("%s", dna[i]);
            int sum = 0;
            for(j = 0; j < m; j++) {
                for(k = j+1; k < m; k++) {
                    if(dna[i][j] > dna[i][k]) {
                        sum++;
                    }
                }
            }
            D[i].v = sum, D[i].in = i;
        }
        qsort(D, n, sizeof(Order), cmp);
        for(i = 0; i < n; i++) {
            puts(dna[D[i].in]);
        }
        if(t)
            puts("");
    }
    return 0;
}