快速排序

洛谷p1177模板题https://www.luogu.org/problemnew/show/P1177

题目数据两组乱序的检验算法正确性,一组重复元素,一组正序,一组倒序+重复。

快排算法在递归树中,每层时间近似o(n),算法效率主要取决于每个节点的划分情况,这决定了树中一共有多少层,最好logn层,最差n层。

算导最开始的朴素算法在处理大量重复和大量有序时都表现不好,达到最差o(n^2),随机化原始序列或者随即化主元后,可以处理有序序列,但无法处理重复序列。用朴素的两路三路快排可以处理重复,用o(nlogn)无法处理有序序列,随机化后就卡不掉了。

随机打乱数组元素顺序函数:random_shuffle(a.begin(),a.end()),位于<algorithm>

《算法导论》原始快排过2/5(只适合处理乱序序列)

#include<cstdio>
#include<algorithm>
using namespace std; 

int a[100005],n;

int partition(int *a,int l,int r)
{
	int i=l-1;
	int x=a[r];
	for(int j=l;j<r;j++)
	{
		if(a[j]<=x)
		{
			i++;
			swap(a[i],a[j]);
		}
	}
	swap(a[i+1],a[r]);
	return i+1;
}

void quicksort(int *a,int l,int r)
{
	if(l>=r)return;
	int x=partition(a,l,r);
	quicksort(a,l,x-1);
	quicksort(a,x+1,r);
}

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	quicksort(a,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",a[i]);
	putchar('\n');
	return 0;
}

 

单路快排+随机化过3/5(过不了重复)

#include<cstdio>
#include<algorithm>
using namespace std; 

int a[100005],n;

int partition(int *a,int l,int r)
{
	int i=l-1;
	int x=a[r];
	for(int j=l;j<r;j++)
	{
		if(a[j]<=x)
		{
			i++;
			swap(a[i],a[j]);
		}
	}
	swap(a[i+1],a[r]);
	return i+1;
}

void quicksort(int *a,int l,int r)
{
	if(l>=r)return;
	int x=partition(a,l,r);
	quicksort(a,l,x-1);
	quicksort(a,x+1,r);
}

int main()
{
	freopen("input.in","r",stdin);
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	random_shuffle(a,a+n);
	quicksort(a,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",a[i]);
	putchar('\n'); 
	return 0;
}

双路快排+随机化AC

#include<cstdio>
#include<algorithm>
using namespace std; 
 
int a[100005],n;
 
int partition(int *a,int l,int r)
{
	int i=l,j=r-1;
	int x=a[r];
	while(i<=j)
	{
		while(i<=j&&a[i]<x)i++;    //注意[i,j]都是未知的,所以必须i<=j,不能去掉=,边界情况一定要记好
		while(j>=i&&a[j]>x)j--;   //注意两个while只判断><,不判断=,否则划分区间就会容易不平衡 
		if(i<=j)        
		{	
			swap(a[i],a[j]);
			i++;
			j--;
		}
	}
	swap(a[i],a[r]);
	return i;
}
 
void quicksort(int *a,int l,int r)
{
	if(l>=r)return;        
	int x=partition(a,l,r);
	quicksort(a,l,x-1);
	quicksort(a,x+1,r);
}
 
int main()
{
	//freopen("input.in","r",stdin);
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	random_shuffle(a,a+n);
	quicksort(a,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",a[i]);
	putchar('\n');
	return 0;
}

 

三路快排+随机化AC

#include<cstdio>
#include<algorithm>
using namespace std; 

int a[100005],n;

void quicksort(int *a,int l,int r)
{
	if(l>r)return;
	
	int x=a[r];
	int lt=l-1,rt=r,i=l;
	while(i<rt)
	{
		if(a[i]==x)i++;
		else if(a[i]<x)
		{
			swap(a[i],a[lt+1]);
			lt++;
			i++;
		}
		else if(a[i]>x)
		{
			swap(a[i],a[rt-1]);
			rt--;
		}
	}
	swap(a[rt],a[r]);
	rt++;
		
	quicksort(a,l,lt);
	quicksort(a,rt,r);
}

int main()
{
	freopen("input.in","r",stdin);
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	random_shuffle(a,a+n);
	quicksort(a,0,n-1);
	for(int i=0;i<n;i++)printf("%d ",a[i]);
	putchar('\n');
	return 0;
}

关于单路双路三路排序可以看这篇bloghttps://blog.youkuaiyun.com/k_koris/article/details/80585979

 

 

 

 

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值