题名: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; }