luogu1177:快排模板:二分排序详解

16 篇文章 1 订阅
14 篇文章 1 订阅
博客详细解析了Luogu试炼场的2-3题T1,即使用二分排序算法对给定数字进行从小到大的排序。通过分治策略和函数递归,解释了排序过程中游标x和y的移动规则以及何时交换元素。文章强调理解这一过程的重要性,并在最后提供了相关代码。
摘要由CSDN通过智能技术生成

题目连接:该题是luogu试炼场的2-3:T1


题目大意:
1 给n个数字,要求按从小到大的顺序排好,输出;


解题思路:
1 主要是掌握二分排序的基础原理:分治与函数的自我调用
2 请看下图及讲解:

1 当前 第x层 的比较:
1)每次的排序区域是[L,R],执行比较的游标x从L向右移动>>,游标y从R向左移动<<,当y<x的时候,当前层的比较结束
2)x想右移必须满足:a[x]<mid ,否则x停下等待;
3)y想左移必须满足:mid<a[y] ,否则y停下等待;
4)如果x和y都停下来等待,又没有满足y<x的时候,交换a[x]和a[y]的值,继续进行当前层的比较

2 对于 第(x+1)层 需用分治的思想
1)完成从左边界到右游标的比较:[L,y];直到 L等于y
2)完成从左游标到右边界的比较:[x,R];直到 x等于R

3 直到最后一层时候,所有的左边界和右游标重合,左游标和右边界重合,整个排序完成。


如果你真正能看懂以上的内容,是否就不需要上代码了呢?(奸笑.jpg)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

善良的ls,还是会给代码的:

//luogu1177:快排模板题
//二分排序的思想理解 

#include<cstdio>

int a[100000010];
int n;

void px(int l,int r) //二分排序模板 
{
	int x=l,y=r,m=a[(l+r)/2];//m是当前中间值 
	
	while(x<=y)
	{
		while(a[x]<m) x++;//x是左区间的游标,向右移动>> 
		while(a[y]>m) y--;//y是右区间的游标,向左移动<< 
		
		if(x<=y)//如果不动了,交换当前值 
		{
			int t=a[x]; a[x]=a[y]; a[y]=t; x++; y--;
		}
	}
	//排好了当前的左右区间,进下一层的两个区间排更小的 
	if(l<y) px(l,y);
	if(x<r) px(x,r);
}

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

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值