POJ1007
2014-08-22
题目意思:
按照各个字符串的逆序数排序(稳定排序,即若A=B,则AB的顺序还是原来的样子)
思路:
求出每个字符串的逆序数后,排序输出即可
代码:
//Memory Time // 352K 16MS #include <stdio.h> #include <stdlib.h> typedef struct Dna{ int num; char sequence[50]; }DNASQ; //计算逆序数 int count(char sq[],int len){ int a,c,g,i; int count; a=c=g=0; for(i=len-1;i>=0;i--){ switch (sq[i]){ case 'A': { a++; break; } case 'C': { c++; count+=a; break; } case 'G': { g++; count=count+a+c; break; } case 'T': { count=count+a+c+g; break; } default: break; } } return count; } int partition(DNASQ sq[],int left,int right){ int i=left; int j=right; DNASQ temp=sq[i]; while(i!=j){ while(sq[j].num>=temp.num&&i<j) j--; while(sq[i].num<=temp.num&&i<j) i++; if(i<j) { DNASQ t; t=sq[i]; sq[i]=sq[j]; sq[j]=t; } } sq[left]=sq[i]; sq[i]=temp; return i; } //快排 void qSort(DNASQ sq[],int left,int right){ int dq=0; if(left<right){ dq=partition(sq,left,right); qSort(sq,left,dq-1); qSort(sq,dq+1,right); } } int main(){ DNASQ dnasq[100]; int n,m,i; scanf("%d%d",&n,&m); for(i=0;i<m;i++){ scanf("%s",dnasq[i].sequence); dnasq[i].num=count(dnasq[i].sequence,n); } qSort(dnasq,0,m-1); for(i=0;i<m;i++){ printf("%s\n",dnasq[i].sequence); } return 0; }
PS:这题由于字符串中只含有AGCT四个字母,所以在求逆序数的时候可以直接计数就行了。