码迷,mamicode.com
首页 > 编程语言 > 详细

POJ 1007 DNA Sorting (归并排序)

时间:2015-07-27 19:07:24      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

题意:

输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。

PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。

思路:裸归并排序了  不懂得可以参考下http://blog.csdn.net/morewindows/article/details/6678165/  但是他的代码写错了!后来我按照理解自己写了一个,测了一下是对的!

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;

const int maxn=100+10;
char s1[maxn];

struct node
{
    string s;
    int tot;
}num[maxn];

int a[105];

bool cmp(node x,node y)
{
    return x.tot<y.tot;
}

int b[maxn];
int Count;


void Merge(int *a, int start, int mid , int end)  //归并排序的合并部分
{
	int i = start,j = mid + 1,k = start;
	while(i <= mid&&j <= end)
	{
		if(a[i] <= a[j])
		{
			b[k++] = a[i++];
		}
		else
		{
			Count += j - k;
			b[k++] = a[j++];
		}
	}
	while(i <= mid)
	{
		b[k++] = a[i++];
	}
	while(j <= end)
	{
		b[k++] = a[j++];
	}
	for(int i = start; i <= end; i++)
	{
		a[i] = b[i];
	}
}

void MergeSort(int *a, int start, int end)
{
	if(start < end)
	{
		int mid = (start + end)/2;
		MergeSort(a,start,mid);
		MergeSort(a,mid+1,end);
		Merge(a,start,mid,end);
	}
}

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++)
    {
        Count=0;
        scanf("%s",s1);
        for(int j=0;j<n;j++)
        {
            a[j]=s1[j]-'A';
        }
        MergeSort(a,0,n-1);
        num[i].s=s1;
        num[i].tot=Count;
    }
    sort(num,num+m,cmp);
    for(int i=0;i<m;i++)
    {
        cout<<num[i].s<<endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 1007 DNA Sorting (归并排序)

标签:

原文地址:http://blog.csdn.net/u012313382/article/details/47086993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!