学习思路
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]
追加
其实上面的反思是不太对的,今天学完归并后发现快排的思路不是基于中间位置是最优的,而是基于你每次选择的数值是所有数中最中间的,也即可以把序列尽可能分为两部分长度相同时,此时的效率最高
本文介绍了学习快速排序的思路,包括理解算法思想、背诵模板、练习题目和反思优化。详细阐述了快速排序的基本步骤:确定分界点、调整区间和递归处理。在实践中,强调了选择分界点的重要性,指出不应固定在两端或中间,而应尽量使序列分成长度相近的两部分以提高效率。

4079

被折叠的 条评论
为什么被折叠?



