算法与数据结构5.1 Just Sort

★实验任务

给定两个序列 a b,序列 a 原先是一个单调递增的正数序列,但是由于某些 原因,使得序列乱序了,并且一些数丢失了(用 0 表示)。经过数据恢复后,找 到了正数序列 b ,且序列 a 中 0 的个数等于序列 b 的个数,打算使用序列 b 恢 复序列 a 。
对于序列 a 来说,我们可以交换两个位置上的非零的数,并且可以交换任意 次。序列 b 同样也可以进行任意次交换。
现在要将序列 b 填充到序列 a 中的值丢失的位置上,序列 b 中的每个数只能 填充一次,问最后构成的序列是否是单调递增的,如果是,则输出填充后的序列, 否则输出-1。

★数据输入

输入给定 N M,表示序列 a 和序列 b 的长度。 第一行为序列 a ,第二行为 序列 b。 题目保证除了 0 以外的数,在序列 a 和 b 中只出现一次。
数据保证: 80%的数据,N, M <= 100
100%的数据,N, M <= 100000, 0 <= a[i] <= 100000, 0 < b[i] <= 100000

★数据输出

如果最后序列 a 是单调递增的,输出该序列,否则输出-1。

输入示例 输出示例
4 2
0 11 0 15
1 12
1 11 12 15

输入示例 输出示例
4 2
0 0 11 15
1 12
-1

思路

将第一次输入的序列中的非零数取出来存入数组b,并将位置标记为-1,将取出的数组b和后输入的序列排序后,按照标记(0和-1)填入数组,判断是否递增即可。


但是这道题我得到了十个SO,原因是在main函数里开了3个100000的数组导致。

Code

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
int partition(int *arr,int l,int r);
void swap(int &x,int &y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
}
void quicksort(int *arr,int l,int r)
{
	int i;
	if(l>=r)return;
	i=partition(arr,l,r);                 //找到中间数 
//	cout<<i<<endl;
	quicksort(arr,l,i-1);                 //对左半边排序 
	quicksort(arr,i+1,r);                 //对右半边排序 
}
int partition(int *arr,int l,int r)
{
	int v=l;
	int x=arr[v];
	int i=l;
	int j=r+1;
	while(1)
	{
		while(i+1<=r)
		{
			if(arr[i+1]<x)
			{
				i++;
			}
			else
			{
				i++;
				break;
			}
		}
		while(j-1>=l)
		{
			if(arr[j-1]>x)
			{
				j--;
			}
			else
			{
				j--;
				break;
			}
		}
		if(i>=j)break;
		swap(arr[i],arr[j]);
	}
	swap(arr[v],arr[j]);
	return j;
}
int main()
{
	int a[100001],b[100001],c[100001];
	int m,n,i,j,flag=0;
	scanf("%d %d",&m,&n);
	for(i=0,j=0;i<m;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]!=0)
		{
			b[j++]=a[i];
			a[i]=-1;
		}
	}
//	for(i=0;i<m;i++)
//			printf("%d",a[i]);	
//	printf("
");
//	for(i=0;i<j;i++)
//			printf("%d",b[i]);	
//	printf("
");
	for(i=0;i<n;i++)
		scanf("%d",&c[i]);
	quicksort(b,0,j-1);
	quicksort(c,0,n-1);
//	for(i=0;i<j;i++)
//			printf("%d ",b[i]);	
//	printf("
");
//	for(i=0;i<n;i++)
//			printf("%d ",c[i]);	
//	printf("
");
	int x=0,y=0;
	for(i=0;i<m;i++)
	{
		if(a[i]==0)
		{
			a[i]=c[x++];
		}
		else
		{
			a[i]=b[y++];
		}
	}
//	for(i=0;i<m;i++)
//			printf("%d ",a[i]);
//	printf("
");
	for(i=0;i<m-1;i++)
	{
		if(a[i]>a[i+1])
		{
			flag=1;
			break;
		}
	}
	if(flag)
	{
		printf("-1");
	}
	else
	{
		for(i=0;i<m;i++)
			printf("%d ",a[i]);
	}
	return 0;
}
        
原文地址:https://www.cnblogs.com/031602523liu/p/7740226.html