快排在大多场景中目前所有排序算法中,最快的算法,一些特定场景,希尔排序较快。快排是所有排序算法中最重要的算法,被誉为20世纪十大算法之一。
快速排序可以简单认为是冒泡排序的优化版,解决了冒泡中的缺陷:反复交换。而快排可以在一次循环中(递归调用),找出某个元素的正确位置,并且该元素之后不需要任何移动。
快排思想来自于算法领域的重要思想分治。假设对数据序列{23, 4, 13, 10, 76, 7, 12, 99, 72}进行快排,操作步骤:
- 选择任意一个数据,如 13,然后将所有比13小的数据放在13的左边,所有比13大的数据放在13的右边,具体步骤:
- 将13放置在数组最末尾(最前也可),此时数据为:{23, 4, 72, 10, 76, 7, 12, 99, 13}
- 初始化两个指针:left为 23, right为 99
- left向右开始查找比13大的数据,此时23就已经是了,所以left找到了23
- right向左查找比13小的数据,right会找到12
- 由于此时 right 比 left 小了,那么让 left和right的值交换
- left和right不断重复上述循环,一旦left和right相等,那么该位置就是13的真正位置!!!,在上述示例中,left和right会在76处相遇,此时交换76和13即可
- 得到的最终结果:{23, 4, 13, 10, 13, 7, 12, 99, 16}
- 对上述步骤进行递归:13的左侧进行上述步骤,13的右侧也进行上述操作
上述选择出来的数据叫做枢纽,枢纽的选择会极大影响快排的效率,如果选择出来的枢纽让数据左右等分,那么此时快排的效率是最高的。
一般常用的选取枢纽的方式是:取出头、中、尾的中位数,在上述案例中,数组的头是23,中是76,尾是72,则中位数是72
- 最坏情况:每次选择的枢纽都是最左边或者最右边,此时等同于冒泡排序
- 平均效率:O(nlogn)