注解
1、求逆序数。本题用的是直接交换的O(n^2)的方法。也可以采用归并排序等更高级的排序算法,降低时间复杂度。
代码
#include <iostream>
#include <algorithm>
using namespace std;
struct DNA{
int id;
string str;
int cnt = 0;
};
int compare(DNA s1, DNA s2){
if(s1.cnt!=s2.cnt){
return s1.cnt<s2.cnt;
}
else{
return s1.id<s2.id;
}
}
int main() {
int T;
cin>>T;
for(int i=0; i<T; i++){
int n, m;
cin>>n>>m;
DNA s[m];
for(int j=0; j<m; j++){
cin>>s[j].str;
s[j].id = j;
}
for(int j=0; j<m; j++){
for(int k=0; k<n; k++){
for(int kk=k+1; kk<n; kk++){
if(s[j].str.at(k)>s[j].str.at(kk)){
s[j].cnt++;
}
}
}
}
sort(s, s+m, compare);
for(int j=0; j<m; j++){
cout<<s[j].str<<endl;
}
}
return 0;
}