PKU 1007

题名:DNA排序

题意:给定字符串长度、个数,计算每个字符串的逆序数,然后从大到小排列,有兴趣的可以去看下原题。

计算字符串逆序数,然后排序,这里使用了快速排序算法,string释放的时候竟然有问题,直接字符数组吧。

// 1007.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
class data
{
public:
    char s[51];
    int c;
};
int partion(data a[],int p,int r){
    int x = a[r].c;     //通常,拿最后一个值,作为预期的中间值
    int middle = p;   //记录“较小的一段数据”的最大下标。通常这个值在p和r的中间,故起名middle
    data *temp=new data;
    for (int j = p ; j < r ; j++){
        if (a[j].c < x){
            
            memcpy(temp,&a[middle],sizeof(data));
            //int temp  = a[middle].c;
            memcpy(&a[middle],&a[j],sizeof(data));
            //a[middle] = a[j];
            memcpy(&a[j],temp,sizeof(data));
            //a[j] = temp;
            middle++;
        }
    }
    //int temp = a[r];
    memcpy(temp,&a[r],sizeof(data));
    //a[r]     = a[middle];
    memcpy(&a[r],&a[middle],sizeof(data));
    //a[middle] = temp;
    memcpy(&a[middle],temp,sizeof(data));
    delete temp;
    return middle;
}


void QuickSort(data a[],int p,int r){
    if (p<r){
        int q=partion(a,p,r);
        QuickSort(a,p,q-1);
        QuickSort(a,q+1,r);
    }
}

int main(int argc, char* argv[])
{
    int slen=0,snum=0;
    cin>>slen>>snum;
    int count=0;
    char temp[200]={0};

    data *d1=new data[snum];
    while (count<snum)
    {
        cin>>temp;
        strcpy(d1[count].s,temp);        
        int bigTimes=0;
        for (int i=0;i<strlen(temp)-1;i++)//计算大的次数
        {
            for (int j=i+1;j<strlen(temp);j++)
            {
                if(temp[i]>temp[j])
                    bigTimes++;

            }
        }
        d1[count].c=bigTimes;
        count++;
    }
    QuickSort(d1,0,count-1);
    for (int i=0;i<count;i++)
    {
        //strcpy(temp,d1[i].s.c_str());
        cout<<d1[i].s<<endl;
    }
    delete []d1;
    return 0;
}
原文地址:https://www.cnblogs.com/alphaxz/p/3482467.html