Acwing - 算法基础课 - 快速排序

本文介绍了学习快速排序的思路,包括理解算法思想、背诵模板、练习题目和反思优化。详细阐述了快速排序的基本步骤:确定分界点、调整区间和递归处理。在实践中,强调了选择分界点的重要性,指出不应固定在两端或中间,而应尽量使序列分成长度相近的两部分以提高效率。

学习思路

1.课上:理解思想

2.课下:

首先背会模板

其次练习模板题目

最后删除代码自己再重写,练习熟练度
 
 

快排基本思想

1.确定分界点

分界点x可以取q[ l ],q[ l + r >> 1],q[ r ],随机选个数

2.调整区间

把所有小于x的数放在x左边,所有大于x的数放在x右边

3.递归处理左右两段

 
 

模板代码

void quick_sort(int q[], int l, int r)
{
	if(l >= r)	return;
	
	int i = l - 1, j = r + 1, x = q[l + r >> 1];
	while(i < j)
	{
		do i ++; while(q[i] < x);
		do j --; while(q[j] > x);
		if(i < j) swap(q[i],q[j]);
	}
	quick_sort(q, l , j);
	quick_sort(q, j+1, r);
}

 
 

练习题目

#include<iostream>
using namespace std;

const int N = 1e6+10;

int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
	if(l >= r)	return;
	
	int i = l - 1, j = r + 1, x = q[l + r >> 1];
	while(i < j)
	{
		do i ++; while(q[i] < x);
		do j --; while(q[j] > x);
		if(i < j) swap(q[i],q[j]);
	}
	quick_sort(q, l , j);
	quick_sort(q, j+1, r);
}


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

 
 

反思

在刚开始写代码时,让分界点x = [ l ],也即左端点时,最后运行时间总是会超时,看题解下面的评论才发现当测试的数量集太大时,把分界点设在两端时会很慢,此时就需要把分界点设置到中间位置,所以为了快排的最高效率,以后写代码可以直接让分界点x = [ l + r >> 1]
 
 

追加

其实上面的反思是不太对的,今天学完归并后发现快排的思路不是基于中间位置是最优的,而是基于你每次选择的数值是所有数中最中间的,也即可以把序列尽可能分为两部分长度相同时,此时的效率最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值