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 }

 

你可能感兴趣的:(排序)