1 概念
快速排序使用的是分治思想。
分治法
分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在计算机科学中,分治法就是运用分治思想的一种很重要的算法。分治法是很多高效算法的基础,如快速排序,归并排序,傅立叶变换(快速傅立叶变换)等等。
空间复杂度
空间复杂度为O(log2n)。
时间复杂度
最好的情况是O(n),最差的情况是O(n2),平均时间复杂度O(nlogn)。
2 基本思路
随机找出一个数,一般选择第一个或者最后一个作为基准。将数组进行比较比基准大的发在右边,小的放在左边,这样交换完左边都是比基准小的,右边都是比较基准大的,这样就将一个数组分成了两个子数组,然后再按照同样的方法把子数组再分成更小的子数组,直到不能分解为止。
void quickSort(int s[], int l, int r)
{
// 递归结束的条件
if (l >= r)
{
return;
}
int i = l; // 开始位置
int j = r; // 最后一个元素的位置
// 基准数
int tmp = s[l]; // 取第一个元素作为基准数 -- i的位置是坑
// 循环判断
while (i < j)
{
// j位置的元素, 大于等于基准数
while (i<j && s[j] >= tmp)
{
// 前移
j--;
}
// 找到了填坑的数
if (i < j)
{
// 填坑
s[i] = s[j]; // j变成坑
// i后移
i++;
}
// 移动i, 坑不移动
// i位置的元素 小于基准数
while (i < j && s[i] < tmp)
{
i++;
}
// 找到了大于等于基准数的元素
if (i < j)
{
// 填后边的坑
s[j] = s[i];
// j前移
j--;
}
}
// i j 相遇 i==j
// 填坑
s[i] = tmp;
// 拆分左半部分
quickSort(s, l, i - 1);
// 右
quickSort(s, i + 1, r);
}