一:概述
快速排序、归并排序、堆排序等都是比冒泡排序更快的算法。其中快速排序是从冒泡排序演变而来。
快速排序之所以比冒泡排序要快是因为它用了分治法。
二:具体说明
同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较进行比较和交换位置来达到排序的目的。
不同的是,冒泡排序在每一轮中只把一个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其把比它的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。
上图这种思路就是分治法。
每次把数列分成两部分,好处就是:
假如给出一个8个元素的数列,一般情况下,使用冒泡排序需要比较7轮,每一轮把1个元素移动到数列的一端,时间复杂度是O(n^2)。
快速排序的流程如下:
如图所示,在分治法的思想下,原数列在每一轮都被拆分成两部分,每一部分在下一轮又被拆分成两个部分,直到不能拆分为止。
每一轮的比较和交换,需要把数组全部元素都遍历一遍,时间复杂度是O(n).这样的遍历:假如元素的个数为n,则平均情况下需要logn轮,因此快速排序算法总体的平均时间复杂度是O(nlogn).
快速排序的核心问题是基准元素的选择和元素的交换。