快速排序的核心思想是,对于一个数组,当我选定其中的一个数值(这里以数组当前的首元素为例),我通过交换等手段让数组中所有比该元素小的元素都跑到该元素的左边,所有比该元素大的元素都跑到该元素右边。完成后,再分别对该元素的左右两部分子数组进行同样的操作,依此类推,若干次运算之后,整个数组就可以排好序了。
对于快速排序而言,每次确定中心点并以此为依据交换元素时,对于整个数组而言(因为计算几次之后,整个数组会被分成若干个小数组),时间复杂度都为O(N),因此制约快速排序速度的因素就是排序时处理的次数,亦即多少次循环之后,对于每一个选定的中间值其左数组和右数组所含元素均不大于1(这种情况下,对于一个小部分来说,只要被选定元素的左面小于它,右面大于它,这个小部分就是有序的,亦即整个数组也是有序的)。由于快速排序的方法在直观上类似二叉树,可以想象,选取的中间值其本身的大小越接近待处理部分的数组中间元素的大小,整个数组被分割成单个元素的速度也就越快。反之,如果整个数组原本就很有序,那首元素的最终位置还是接近数组的开头部分,那数组被分割成单个元素需要的循环次数也就越多,所要花费的时间也就越长。这也就是为什么对于快速排序而言,数组越有序,排序花费的时间反而越多。
当我们排序一个数组时,我们只能决定我们排序的方式,没法决定排序的对象。而对于快速排序而言,数组内容会显著影响排序的速度,而选取的值在最终数组中的位置又是决定排序速度的关键。因此,在排序开始之前,应该额外增加一步,让我选择的初始值更接近数组最终排好序时的中间位置。这就需要用到三数取中法。<