归并

我想写个指针怎么就这么难

挂掉的指针代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100010];
int p1,p2;
void merge(int p1,int mid,int p2)
{
	int n1=mid-p1+1,n2=p2-mid;
	int *l=new int[n1],*r=new int[n2];
	for(int i=0;i<n1;i++)l[i]=a[i+p1];
	for(int i=0;i<n2;i++)r[i]=a[i+mid+1];
	int i=0,j=0,k=p1;
	while(i<n1&&j<n2)
	{
		if(l[i]<=r[i])a[k]=l[i++];
		else a[k]=r[j++];
		k++;
	}
	if(i<n1)for(;i<n1;i++,k++)a[k]=l[i];
	if(j<n2)for(;j<n2;j++,k++)a[k]=r[j];
}
void ssort(int p1,int p2)
{
	int mid=0;
	if(p1<p2)
	{
		mid=(p1+p2)/2;
		ssort(p1,mid);
		ssort(mid+1,p2);
		merge(p1,mid,p2);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	ssort(0,n-1);
	for(int i=0;i<n;i++)printf("%d ",a[i]);
	return 0;
}
过掉的数组代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
using namespace std;
int n,a[500010],ans[500010];
long long cnt;
void merge(int p1,int p2)
{
    if(p1==p2)return;
    int mid=(p1+p2)/2,i=p1,j=mid+1,k=p1;
    merge(p1,mid);
	merge(mid+1,p2);
    while(i<=mid&&j<=p2)
    {
    	if(a[i]<=a[j])ans[k++]=a[i++];
    	else
		{
			ans[k++]=a[j++];
			cnt+=mid-i+1;
		}
	}
    while(i<=mid)
    	ans[k++]=a[i++];
    while(j<=p2)
    	ans[k++]=a[j++];
    for(int l=p1;l<=p2;l++)
    	a[l]=ans[l];
}
int main()
{
    scanf("%d",&n); 
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    merge(1,n);
    printf("%lld",cnt);
    return 0;
}

//可能写指针不是个好兆头把(误
//另外:STL大法好啊
merge(first1,last1,first2,last2,result,compare);见瑞士轮
result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。

posted @ 2021-12-09 20:41  fervency  阅读(28)  评论(0编辑  收藏  举报