归并排序(适用于数据基本有序)

142 篇文章 0 订阅
73 篇文章 0 订阅

原题https://www.luogu.org/problemnew/show/P1309
题解:这个题目全程调用sort()会超时,考虑到数据都是基本有序的这一特点,应选择归并排序。快速排序适用于数据顺序比较随机的情况。

#include<bits/stdc++.h>
using namespace std;
struct NODE
{
	int score;
	int sl;
	int bh;
}; 
int n;
NODE xuan[200005];
NODE win[100005];
NODE lose[100005];
bool cmp(NODE x,NODE y)
{
	if(x.score!=y.score) return x.score>y.score;
	else return x.bh<y.bh;
}
void merge()
{
	int i=1,j=1,k=1;
	while(i<=n&&j<=n)
	{//结构体赋值可以直接来 
	    if(win[i].score>lose[j].score) xuan[k++]=win[i++];	
		if(win[i].score<lose[j].score) xuan[k++]=lose[j++];
		if(win[i].score==lose[j].score&&win[i].bh<lose[j].bh) xuan[k++]=win[i++];
		if(win[i].score==lose[j].score&&win[i].bh>lose[j].bh) xuan[k++]=lose[j++];
	}	
	while(i<=n) {xuan[k++]=win[i++];}
	while(j<=n) {xuan[k++]=lose[j++];}
}
int main()
{
	int k,i,r,q,nn;
	cin>>n>>r>>q;
	nn=n<<1;
	for(i=1;i<=nn;i++) cin>>xuan[i].score;
	for(i=1;i<=nn;i++) {cin>>xuan[i].sl;xuan[i].bh=i;}
	sort(xuan+1,xuan+nn+1,cmp);
	for(k=0;k<r;k++)
	{
	    for(i=1;i<=n;i++)
		{
			if(xuan[i*2-1].sl>xuan[2*i].sl) 
			{
			    win[i]=xuan[i*2-1];lose[i]=xuan[2*i];win[i].score++;
			}
			else
			{
				win[i]=xuan[2*i];lose[i]=xuan[i*2-1];win[i].score++;
			}
		}
		merge();	
	}
	cout<<xuan[q].bh<<endl;
//	for(i=1;i<=nn;i++) cout<<xuan[i].bh<<' '<<xuan[i].score<<' '<<xuan[i].sl<<endl;	
  }  

以上代码中的归并排序采用了非递归形式,下面是递归形式的归并排序

#include<bits/stdc++.h>
using namespace std;
int A[100];
const int maxn=100;
void merge(int A[],int L1,int R1,int L2,int R2){
	int i=L1,j=L2;
	int temp[maxn],index=0;
	while(i<=R1&&j<=R2){
		if(A[i]<=A[j]){
			temp[index++]=A[i++];
		}else{
			temp[index++]=A[j++];
		}
	}//index是temp数组的下标 
	while(i<=R1) temp[index++]=A[i++];
	while(j<=R2) temp[index++]=A[j++];
	for(i=0;i<index;i++){
		A[L1+i]=temp[i];
	}
}

void mergeSort(int A[],int left,int right){
    if(left<right){
    	int mid=(left+right)/2;
    	mergeSort(A,left,mid);
    	mergeSort(A,mid+1,right);
    	merge(A,left,mid,mid+1,right);
	}	
}

int main()
{
	int i,j,n;
	cin>>n;
	for(i=1;i<=n;i++) cin>>A[i];
	cout<<endl;
	mergeSort(A,1,n);
	for(i=1;i<=n;i++) cout<<A[i]<<' ';
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值