标签:style blog io color ar os sp for strong
【题目描述】
计算每条DNA(字符串)的inversions,即按字典序,每一字符比后面字符大的数量之和。最后按inversions从小到大排序输出,相同inversions的输出原序。
【思路分析】
1. 存储结构
采用vector存储DNA字符串,并用一个二维数组sortScore[101][2],存放{inversions, id}。
2. 计算inversions
将该字符c与后面所有字符比较,计数即可。
for (int chari(0); chari < length; chari++) { char testchar = testdna[chari]; for (int charj(chari+1); charj < length; charj++) { if (testdna[charj] < testchar) sortScore[dnai][0]++; } }
3. 排序算法(稳定与非稳定)
首先看看稳定排序算法,即相同数值保持原序,包括:
接下来是非稳定排序算法,无法保证相同数值按照原序排列,包括:
按理来说应该采用稳定的排序算法,但用快排(不稳定)也可以通过。采用快排qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) ) 该函数。按本题来说,要对二维数组进行排序,则num为二维数组的行数,size为二维数组一行的长度,故如下调用方式:
qsort(sortScore, num, sizeof(int)*2, CompareFunction);
其中,比较函数需要看成是一维数组的方式进行比较,a和b看成是一维数组指针,然后对相应单元进行比较,(下面代码代表从小到大排序)则为:
int CompareFunction(const void* a, const void* b) { int *pa = (int*)a; int *pb = (int*)b; return pa[0] - pb[0]; }
【小结】
该题需要关注的重点在于:稳定与非稳定排序算法、qsort()的二维数组排序方法。
【附:完整代码】
#include <iostream> #include <vector> #include <string> using namespace std; int sortScore[101][2]; // {inversion, id} int CompareFunction(const void* a, const void* b) { int *pa = (int*)a; int *pb = (int*)b; return pa[0] - pb[0]; } long Partition(int arraylist[][2], int low, int high) { int toBePosition[2]; memcpy(toBePosition, arraylist[low], sizeof(arraylist[low])); while (low < high) { while (low < high && arraylist[high][0] >= toBePosition[0]) high--; memcpy(arraylist[low], arraylist[high], sizeof(arraylist[high])); while (low < high && arraylist[low][0] <= toBePosition[0]) low++; memcpy(arraylist[high], arraylist[low], sizeof(arraylist[low])); } memcpy(arraylist[low], toBePosition, sizeof(toBePosition)); return low; } void QSort(int arraylist[][2], int low, int high) { if (low < high) { long pos = Partition(arraylist, low, high); QSort(arraylist, low, pos-1); QSort(arraylist, pos+1, high); } } int main() { int length, num; cin>>length>>num; vector<string> DNAs; memset(sortScore, 0, sizeof(sortScore)); for (int i(0); i < num; i++) { string tempstr; cin>>tempstr; DNAs.push_back(tempstr); sortScore[i][0] = 0; sortScore[i][1] = i; } // 计算每个DNA的inversion for (int dnai(0); dnai < num; dnai++) { string testdna = DNAs[dnai]; for (int chari(0); chari < length; chari++) { char testchar = testdna[chari]; for (int charj(chari+1); charj < length; charj++) { if (testdna[charj] < testchar) sortScore[dnai][0]++; } } } qsort(sortScore, num, sizeof(int)*2, CompareFunction); //QSort(sortScore, 0, num-1); // 自己写的快排也可以AC for (int i(0); i < num; i++) { int strindex = sortScore[i][1]; cout<< DNAs[strindex] <<endl; } return 0; }
标签:style blog io color ar os sp for strong
原文地址:http://www.cnblogs.com/xcwu/p/4103303.html