题目链接
题目梗概
实现快速排序
解题思路
快速排序的排序思想大致可以分为一下几部分
- 以数组中某一个数K为标准,通过调整数组中元素位置,让数组中元素的大小分布泾渭分明,左边小于(等于)K,右边大于(等于)K。这样对于整个数组而言就达到了基本有序的状态。之所以称为基本有序,是指左右两子数组的相对位置确定了下来,在正确的排序下,左数组的元素不会到右数组中去,右数组的元素不会到左数组中去。
- 分别对第一步提到的左数组和右数组再做类似的排序工作,使它们也达到基本有序。
- 对排序产生的子数组重复进行第二步,直到子数组的长度小于等于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