一、快速排序简介
快速排序是一种交换排序,通过元素之间的比较和交换位置来达到排序的目的。
常见的冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素(pivot),并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。 这种思路就叫作分治法,如下图所示。
如图所示,在分治法的思想下,原数列在每一轮都被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止。 每一轮的比较和交换,需要把数组全部元素都遍历一遍,时间复杂度是O(n)。 假如元素个数是n,平均情况下需要遍历logn轮,因此快速排序算法总体的平均时间复杂度是O(nlogn)。
但如果每次选取的基准元素都是数列未排序部分的最大值或最小值,每轮就只能确定基准元素这一个元素的位置,无法发挥分治法的优势,因此快速排序的最差时间复杂度是O()。
常见的基准元素选取方法有两种:每次选取数组的首元素,或者每次随机选取元素。
二、元素交换方法
选定了基准元素以后,下一步要做的就是把其他元素