快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,
其基本思想为:
任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
将区间按照基准值划分为左右两半部分的常见方式有:
1. hoare版本
2. 挖坑法
3. 前后指针版本
递归方式
如果当中元素个数多于一个,则进行快排
//从右侧位置开始选择
//给两个指针,一个放在最左边,一个放在最右边,左边找比key大的,找到停下,右边找小的,找到停下,然后把这两个进行交换
//两个相遇后,当前的位置元素,与最后元素交换,也就是与key交换
//begin从前往后找比基准值大的元素,找到停下
while (begin<end&&array[begin]<=key){ //比key小或者等于往后走,大停下来,找到大的,如果本身序列最大的数在最后一个,begin会越界,则必须保证begin<end
//end从后往前找比基准值小的元素,找到停下来
//找到小的
//如果两个不在同一个位置
//两个交换
//end和begin相遇,把他们当前指向的数与key进行交换
挖坑法
前后指针版本
基准值取数组最后一个元素
cur开始遍历数组,如果当前cur里的值小于基准值,pre往后走一步,两个在同一个位置,不再同一位置进行交换。如果cur的值大于基准值,cur一个人往前走。
最好场景:数据越随机,越乱越好O(n log2 n)
最差的场景:接近有序O(n*n)
三数取中法降低最差场景
之前的操作要做一些改动