快速排序及其随机化(算法导论)

本文介绍了快速排序算法,强调其适用于数据多、范围小、重复数据的情况,并指出初始顺序对排序效率的影响。通过随机化策略使排序过程更均匀。文章提到了代码实现中的注意事项,如使用队列和指针,以及参考《算法导论》实现快排函数。

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

如果对快速排序和分治不是很熟悉,建议先观看网易公开课上与算法导论配套的麻省理工的算法导论课程。

  1. 算法描述
    简单来说,输入一组数,选取一个作为主元,遍历整个数组,将比主元小的数扔到主元左边,比主元大的数扔到主元右边,然后对主元的左右两个区间再次这样排序,直到整个数组排序完成。
  2. 特点
    适用于数据多,范围小,且经常重复的数据,不适合范围大,分化严重的数据。初始数组越接近顺序排列,此排序耗时越长。此法平均复杂度比插入排序小很多,但它不需要额外的空间。归并排序虽然最快,却需要大量的额外空间。

  3. 输入的数据大多时候并非随机的,所以我们要在排序过程中打乱其原有顺序,使得分布更加均匀。

读本代码需要注意的几个地方

  1. 输入只有一串不确定的数字。因此,为了节省空间,我用了一个队列计算和暂存数字N,再依据N来建立数组。
  2. 由于无法将数组作为实参传递给函数,所以本代码使用了指针。由于指针操作的数组内存必须连续,所以我用malloc函数来申请数组空间。
  3. 两个快排函数可以参考算法导论一书。

代码

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值