快速排序
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序
时间复杂度:O(NlogN)
空间复杂度:O(1)
稳定性:不稳定
快速排序一共有三种:固定位置选取基准法(过程见下图)
随机选取基准法(基准选取不是arr[0],而是随机选取)
三分选取基准法(过程见下)
1.左中右三个数排序,并将中间数作为基准
2.将基准放到数组末尾(将基准与右端点前一个数交换)
3.从low向后查找第一个比tmp大的数,同时从high向前查找第一个比tmp小的数,两数交换(只找到9,此时9 6交换)
第一轮结束,此时6左边的数都小于它,右面的数都大于它,将数组分成两部分
接下来递归处理,对每一个子序列进行三位取中
算法优化:
1.如果排序的数据过少,直接插入法
2.聚集相同基准元素法 (一次划分后,把与par相等的元素聚在一起)
画图文字表述过程:
一趟快排过程:
tmp中存放arr[0],用low指针指向头,high指针指向尾
1.从high位置向前找第一个比tmp小的数,并与low所指位置交换,此时low向后走
2.low向后查找第一个比tmp大的数,并与之交换,此时high向前走
3.high向前查找第一个比tmp小的数,并与之交换,此时low向前走