P1177 【模板】快速排序

本文介绍了快速排序的算法思想,包括如何通过选取数组中某个数作为标准,调整元素位置以达到基本有序状态,以及如何递归地对子数组进行相同操作,直至子数组长度小于等于1。文章还讨论了标准数的选择对排序效率的影响,并提供了选择中间数作为标准数的实现代码。
摘要由CSDN通过智能技术生成

题目链接

P1177 【模板】快速排序

题目梗概

实现快速排序

解题思路

快速排序的排序思想大致可以分为一下几部分

  1. 以数组中某一个数K为标准,通过调整数组中元素位置,让数组中元素的大小分布泾渭分明,左边小于(等于)K,右边大于(等于)K。这样对于整个数组而言就达到了基本有序的状态。之所以称为基本有序,是指左右两子数组的相对位置确定了下来,在正确的排序下,左数组的元素不会到右数组中去,右数组的元素不会到左数组中去。
  2. 分别对第一步提到的左数组和右数组再做类似的排序工作,使它们也达到基本有序。
  3. 对排序产生的子数组重复进行第二步,直到子数组的长度小于等于1。此时,整个数组就达到了完全有序。

标准数的选择,可以随机选择,也可以固定位置,比如每次选最左边的数,或是选最中间的数。平均来看,怎么选择都无所谓,但对于部分数据而言,选择的方式不同复杂度也会不同。比如原本就是有序的数组,如果选最左边的,一共递归n次,递归的数组长度从n递减到1,所以是(1+n)n/2。而如果选择最中间的数,那就是二分,一共递归log(2)n次,每次递归中需要遍历的元素为n个,所以是nlog(2)n。本题中,有些数据就是类似有序的,所以我选择了去中间的数最为标准数。

完整代码

#include <iostream>
using namespace std;
int n;
int array[100010];
int ic = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值