poj2299Ultra-QuickSort

题目链接

poj2299Ultra-QuickSort

思路:直接上归并排序求逆序对的模板把

理解:来源

归并排序&归并排序求逆序对

1.归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略

2.归并排序是稳定排序

3.归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

例子:

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#define in(x) scanf("%lld",&x)
#define out(x) printf("%lld\n",x) 
using namespace std;
const int maxn=1e6+5;
typedef long long int ll;
ll a[maxn],b[maxn];//b为辅助数组 
ll sum=0;
void merge(int l,int r)
{
	if(l==r) return;
	int mid=(l+r)>>1;
	merge(l,mid);
	merge(mid+1,r);
	int i=l,j=mid+1,p=l;
	while(i<=mid&&j<=r){
		if(a[i]>a[j]){
			b[p++]=a[j++];
			sum+=mid-i+1;//这里为核心,a[i]>a[j]时i到mid之间的数与a[i]均构成逆序数 
		}
		else b[p++]=a[i++];
	}
	while(i<=mid){
		b[p++]=a[i++];
	}
	while(j<=r){
		b[p++]=a[j++];
	}
	for(i=l;i<=r;i++) a[i]=b[i];
}
int main()
{
	int n;
	while(scanf("%d",&n),n){
		sum=0; 
		for(int i=1;i<=n;i++){
			in(a[i]);
		}
		merge(1,n);
		out(sum);
	}
} 

猜你喜欢

转载自blog.csdn.net/DaDaguai001/article/details/86563192