部分参考自:優YoU http://user.qzone.qq.com/289065406/blog/1309425334
大致题意:
输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。
PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。
解题思路:
没难度,先求各个字符串的逆序数,再按逆序数对字符串快排,用qsort()函数。
虽然快排不是稳定的排序,但是只要在定义排序规则函数cmp做适当处理,a==b时返回0,即不处理a和b,就不会改变他们之间的相对位置了。
#include <iostream>
#include <string>
using namespace std;
struct dna{
string s;
int num;
}DNA[50];
int inverseNum(string s){
int num,l;
int A,C,G;
num =0;
A = C = G =0;
l = (int)s.length();
for (int i =0; i<l; i++) {
switch (s[l-i-1]) {
case 'A':
A++;
break;
case 'C':
C++;
num += A;
break;
case 'G':
G++;
num += A;
num += C;
break;
case 'T':
num += A;
num += C;
num += G;
break;
}
}
return num;
}
bool compare(structdna a, structdna b){
return a.num<b.num;
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
for (int i=0; i<n; i++) {
cin>>DNA[i].s;
DNA[i].num =inverseNum(DNA[i].s);
}
sort(DNA, DNA+n,compare);
for (int i=0; i<n; i++) {
cout<< DNA[i].s <<endl;
}
return 0;
}