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 }