Ultra-QuickSort

本文介绍了如何通过在归并排序中加入逆序数计数,优化Ultra-QuickSort算法,实现在排序过程中同时统计相邻逆序数,以提升效率。适合巩固算法基础和自我实践AC编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ultra-QuickSort

在这里插入图片描述在这里插入图片描述
参考:逆序数算法

//归并排序+逆序数的数量(相邻逆序数)
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=5e5+10; 
ll n,ans;
ll a[N], aux[N];
void merge(ll a[], ll l, ll r, ll mid) {
	ll  i, j, k;
	for (k = l;k <= r;k++) aux[k - l] = a[k];//将 a 的区间元素复制到 aux 一份,以便将 a 的原区间元素覆盖实现排序
	i = l;j = mid + 1;
	for (k = l;k <= r;k++) {
		if (i > mid) {
			a[k] = aux[j - l];j++;//右边的大数多,此时没有逆序数
		}
		else if (j > r) {
			a[k] = aux[i - l];i++;//左边的大数多,有逆序数
			//ans+=mid-i+1;//这里并不需要? 
		}
		else if (aux[i - l] > aux[j - l]) {//发现逆序数
			a[k] = aux[j - l];j++;
			ans+=mid-i+1;
		}
		else {//非逆序数
			a[k] = aux[i - l];i++;
		}
	}
}
void merge_sort(ll a[], ll l, ll r) {
	if (l >= r) return;
	int mid = (l + r) / 2;
	merge_sort(a, l, mid);
	merge_sort(a, mid + 1, r);
	merge(a, l, r, mid);
}
void mergesort(ll a[], ll l, ll r) {
	merge_sort(a, l, r - 1);
}
int main() {
	while (cin >> n && n) {
		ans=0;
		for (ll i = 0;i < n;i++) cin >> a[i];
		mergesort(a, 0, n);
		/*ll k=0;
		for(ll i=0;i<n;i++){
			cout<<a[i]<<' ';k++;
			if(k%5==0) cout<<endl;
		}*/
		cout<<ans<<endl;
	}
	return 0;
}

前面我们已经学习了归并排序(转载文章),这里只是在归并排序的基础上加之计数变量即可!

(这里顺便提一句:所有的题目都是要自己写出来 AC 为目的,不要求快,而且要定期复习巩固!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值