1104--DNA排序

问题描述:

逆序数可以用来描述一个序列混乱程度的量。例如,“DAABEC”的逆序数为5,其中D大于它右边的4个数·,E大于它右边的1的个数,4+1=5,又如,“ZWQM”的逆序数为3+2+1+0=6.现在有许多长度一样的字符串,每个字符串里面只会出现四种字母(A,T,C,G)。要求编写程序,将这些字符串按照它们的逆序数进行排序

输入:

第一行包括两个正整数,第一个表示字符串长度,第二表示字符串数量

输出:

将每个字符串按照其逆序数进行排序,如果两个字符串的逆序数相等,则按照输入中的两者的先后顺序进行排列

样列输入:

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT输出:

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

 1 #include <stdio.h>
 2 #include <string.h>
 3 struct node
 4 {
 5  int key; // key 存原字符串的编号
 6  char str[55];
 7 }dna[110];
 8 int s(char str[])
 9 {
10 int sum=0,i,j;
11 int len=strlen(str);
12 int sd[50]={0};
13 for(i=0;i<len-1;i++)
14 {
15 for(j=i+1;j<len;j++)
16 {
17 if(str[i]>str[j]) sd[i]++;
18 }
19 }
20 
21 for(i=0;i<len;i++) sum=sum+sd[i];
22 return sum;
23 }
24 
25 void sort(int res[],int m)//简单的一个排序
26 {
27 int i,j,t;
28 for(i=0;i<m;i++)
29 for(j=i+1;j<m;j++)
30 if(res[i]>res[j])
31 {
32 t=res[i];
33 res[i]=res[j];
34 res[j]=t;
35 }
36 }
37 
38 int main(void)
39 {
40 int n,m,i,j;
41 int res[110];
42 scanf("%d %d",&n,&m);
43 if(n>0 && n<=50 && m>0 && m<=100)
44 {
45 for(i=0;i<m;i++)
46 scanf("%s",&dna[i].str);
47 for(i=0;i<m;i++)
48 {
49 res[i]=s(dna[i].str);
50 dna[i].key=res[i];
51 }
52 sort(res,m);
53 for(i=0;i<m;i++)
54 for(j=0;j<m;j++)
55 {
56 if(dna[j].key==res[i] )
57 {
58 printf("%s\n",dna[j].str);
59  dna[j].key=1000000;/*就是这个地方。。。原本是赋的0,那样逆序度为0 的情况就会有问题*/
60 }
61 }
62 }
63 return 0;
64 }

 

posted @ 2015-01-26 22:40  希隆囚徒  阅读(439)  评论(0编辑  收藏  举报