POJ 1007 求逆序数 快排

我自己的思路,顺便复习快排

#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> 嗯。


猜你喜欢

转载自blog.csdn.net/chailyn_trista/article/details/80990017