我自己的思路,顺便复习快排
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int getcount(string s,int len){//求逆序数
int count=0;
for(int i=1;i<len;++i){
for(int j=0;j<i;++j){
if(s[j]>s[i]){
++count;
}
}
}
return count;
}
int quicksort(vector<int>& t,int low,int high,vector<int>& o){
int pivot=t[low],pivot_o=o[low];
while(low<high){
while(pivot<=t[high]&&low<high) --high;
t[low]=t[high];
o[low]=o[high];
while(t[low]<=pivot&&low<high) ++low;
t[high]=t[low];
o[high]=o[low];
}
t[low]=pivot;
o[low]=pivot_o;
return low;
}
void qsort(vector<int>& t,int low,int high,vector<int>& o){
if(low>=high) return;
int mid=quicksort(t,low,high,o);
qsort(t,low,mid-1,o);
qsort(t,mid+1,high,o);
}
int main(){
int m,n;
cin>>m>>n;
vector<string> vstr;
vector<int> count;
vector<int> order;
string s;
for(int i=0;i<n;++i){
cin>>s;
vstr.push_back(s);
count.push_back(getcount(s,m));
order.push_back(i);
}
qsort(count,0,n-1,order);
for(int i=0;i<n;++i){
cout<<vstr[order[i]]<<endl;
}
return 0;
}
求逆序数我用了傻办法,看看人家的方法->
点我
int InversionNumber(char* s,int len)
{
int ans=0; //s逆序数
int A,C,G; //各个字母出现次数,T是最大的,无需计算T出现次数
A=C=G=0;
for(int i=len-1;i>=0;i--)
{
switch(s[i])
{
case 'A':A++;break; //A是最小的,无逆序数
case 'C':
{
C++;
ans+=A; //当前C后面出现A的次数就是这个C的逆序数
break;
}
case 'G':
{
G++;
ans+=A;
ans+=C;
break;
}
case 'T':
{
ans+=A;
ans+=C;
ans+=G;
break;
}
}
}
return ans;
}
qsort也是可以调用滴,记得
#include<algorithm> 嗯。