您的位置:首页 > 其它

PKU 1007

2013-12-19 16:34 246 查看
题名: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: