问题描述:
逆序数可以用来描述一个序列混乱程度的量。例如,“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
#include <stdio.h>
#include <string.h>
struct node
{
int key; // key 存原字符串的编号
char str[];
}dna[];
int s(char str[])
{
int sum=,i,j;
int len=strlen(str);
int sd[]={};
for(i=;i<len-;i++)
{
for(j=i+;j<len;j++)
{
if(str[i]>str[j]) sd[i]++;
}
} for(i=;i<len;i++) sum=sum+sd[i];
return sum;
} void sort(int res[],int m)//简单的一个排序
{
int i,j,t;
for(i=;i<m;i++)
for(j=i+;j<m;j++)
if(res[i]>res[j])
{
t=res[i];
res[i]=res[j];
res[j]=t;
}
} int main(void)
{
int n,m,i,j;
int res[];
scanf("%d %d",&n,&m);
if(n> && n<= && m> && m<=)
{
for(i=;i<m;i++)
scanf("%s",&dna[i].str);
for(i=;i<m;i++)
{
res[i]=s(dna[i].str);
dna[i].key=res[i];
}
sort(res,m);
for(i=;i<m;i++)
for(j=;j<m;j++)
{
if(dna[j].key==res[i] )
{
printf("%s\n",dna[j].str);
dna[j].key=;/*就是这个地方。。。原本是赋的0,那样逆序度为0 的情况就会有问题*/
}
}
}
return ;
}