快速排序
快速排序的概念
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
是对冒泡排序的一种改进。
快速排序的原理
我们以4,6,8,5,9,200,-1,100,-2,-3这样一个数组来进行示例
首先要找到一个基准数,一般来说我们取数组的第一个数为基准数
进行交换后
然后找到一个k,k的左边都比基准值小,右边都比基准值大
然后我们从数组的右边往左找,记这里的数组下标为Right,进行Right–操作
4>-3所以将4和-3进行交换 此时Right=9
-3,6,8,5,9,200,-1,100,-2,4
接下来从数组左面找,记数组下标为Left,进行Left++操作,
-3<4不动,Left=0
6>4 将6和4进行交换,此时Left=1
-3,4,8,5,9,200,-1,100,-2,6
4>-2 交换 此时Right=8
-3,-2,8,5,9,200,-1,100,4,6
8>4 交换 此时Left=2
-3,-2,4,5,9,200,-1,100,8,6
4>-1 交换 此时Right=6
-3,-2,-1,5,9,200,4,100,8,6
5>4 交换 此时Left=3
-3,-2,-1,4,9,200,5,100,8,6
此时满足基准值左边都比基准值小,右边都比基准值大
此时Left=3,就是k的位置。
然后使用分治的思想
把k值左右两边继续递归操作,直到排序完成
快速排序的性能
快速排序在最坏情况下的时间复杂度和冒泡排序一样,是 O(n2),实际上每次比较都需要交换,但是这种情况并不常见。我们可以思考一下如果每次比较都需要交换,那么数列的平均时间复杂度是 O(nlogn),事实上在大多数时候,排序的速度要快于这个平均时间复杂度。这种算法实际上是一种分治法思想,也就是分而治之,把问题分为一个个的小部分来分别解决,再把结果组合起来。
快速排序只是使用数组原本的空间进行排序,所以所占用的空间应该是常量级的,但是由于每次划分之后是递归调用,所以递归调用在运行的过程