接着,将12左右两边的元素再各取最右边的元素为轴,12的右边没有元素,所以,只需要处理左边就可以了,以10为轴,比10小的放在它的左边,比10大的放在它的右边,发现10的右边也没有元素(12已经固定了),经过此步,10的位置固定了。
同样地,最后一步到1这里,排序完成。
让我们来分析一下整个过程的复杂度:
第一步,需要遍历(n-1)个元素;
第二步,需要遍历(n-2)个元素;
...
最后一步,需要遍历0个元素;
这种情况下的时间复杂度为:(n-1) + (n-2) + ... + 1 + 0 = (n-1)n/2 = n^2/2 - n/2,忽略常数项和低阶项,它的时间复杂度为O(n^2)。
所以,对于有序数组,使用经典快速排序,它的时间复杂度为O(n^2),这也是最坏的情况。
但是,似乎从来没有人告诉你,经典快速排序的时间复杂度为O(n^2),而是O(nlog2),这是为什么呢?
那是因为有序数组相对于经典快速排序,也是属于个例,穷举无限多的样本之后,有序数组的可能性实在是太小,所以,我们一般说经典快速排序的时间复杂度为O(nlogn),而不是以最坏情况来评估它的时间复杂度。
我们这里说的是经典快速排序,为什么要加“经典”两个字呢?
后记好了,本节,我们通过两个案例来说明了并不是所有的算法都使用最坏情况来评估它的复杂度。
到现在为止,我们都是使用的大O来表示算法的复杂度,但是,在其它书籍中,你可能还见过Θ、Ω等表示法,它们又是什么意思呢?
下一节,我们接着聊。