您的位置:首页 > 其它

Mathematics:DNA Sorting(POJ 1007)

2015-11-20 01:33 459 查看
                


                DNA排序

  题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列

  这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是他要保持原来的顺序,fcmop那里要写当a.inverse=b.inverse时,返回0

  

#include <iostream>
#include <functional>
#include <algorithm>

using namespace std;
typedef int Position;
typedef struct _set
{
char input[51];
int inverse;
}Set;

void Merge_Sort(Position, Position, int *const);
void Merge(Position, Position, int *const);

static Set input[105];
static char A[53], Tmp_Array[53];

int fcomp(const void *a, const void *b)
{
if ((*(Set *)a).inverse - (*(Set *)b).inverse == 0)
return 0;
return (*(Set *)a).inverse - (*(Set *)b).inverse;
}

int main(void)
{
int line_sum, length, inverse_num;

while (~scanf("%d%d", &length, &line_sum))
{
getchar();
for (int i = 0; i < line_sum; i++)
{
scanf("%s", input[i].input);
strcpy(A, input[i].input);
inverse_num = 0;
Merge_Sort(0, length - 1, &inverse_num);
input[i].inverse = inverse_num;
}
qsort(input, line_sum, sizeof(Set), fcomp);
for (int i = 0; i < line_sum; i++)
printf("%s\n", input[i].input);
}
return 0;
}

void Merge_Sort(Position Left, Position Right, int *const Inverse_Num)
{
if (Left < Right)
{
Position Mid = (Left + Right) / 2;
Merge_Sort(Left, Mid, Inverse_Num);
Merge_Sort(Mid + 1, Right, Inverse_Num);
Merge(Left, Right, Inverse_Num);
}
}

void Merge(Position Left, Position Right, int *const Inverse_Num)
{
Position Mid = (Left + Right) / 2, lpos = Left, rpos = Mid + 1, pos = Left;

for (; lpos <= Mid && rpos <= Right;)
{
if (A[lpos] <= A[rpos])
Tmp_Array[pos++] = A[lpos++];
else
{
Tmp_Array[pos++] = A[rpos++];
(*Inverse_Num) += (Mid + 1 - lpos);
}
}
while (lpos <= Mid)
Tmp_Array[pos++] = A[lpos++];
while (rpos <= Right)
Tmp_Array[pos++] = A[rpos++];
for (int i = Left; i <= Right; i++)
A[i] = Tmp_Array[i];
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: