快速排序(含hoare版本、挖坑版本和前后指针版本)
2.快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
2.1:思路1:(hoare版本):
定义一个左右下标,然后让左边的值等于key,让右边的下标先移动,找到比key小的值,然后左边的在下标移动找到比
key大的值,然后两个值进行交换,最后两个下标相遇的地方那个值一定比key小,然后与key交换就完成了依次循环,然后对key左区间和右区间进行重复上述操作(递归)
注:
左边左key,右边先走,相遇点一定比key小
情况一:右边先走,找到了小,左边再走,左边没找到大,然后两个相遇,相遇点一定比key小
情况二:右边先走,然后找小,没有找到,然后相遇左边,要么就是key,要么就是上一次交换的比key小的值
依次类推:右边左key,那么左边先走
测试horea版本
horea版本代码
快速排序
1.思路1:(hoare版本):
定义一个左右下标,然后让左边的值等于key,让右边的下标先移动,找到比key小的值,然后左边的在下标移动找到比key大的值,然后两个值进行交换,最后两个下标相遇的地方那个值一定比key小,然后与key交换就完成了依次循环,然后对key左区间和右区间进行重复上述操作(递归)
hoare版本的快速排序最坏的情况是逆序或者顺序(这种情况下建立栈帧会发生栈溢出)
可以以下优化(随机选key)
优化思路:随机产生一个中间位置的数,然后加上它的做下标left得到这个数,然后和left进行交换,使得left还是作为key,但是key的值变了
代码如下:(随机选key)
思路2:(挖坑法)
先将左边第一个数取出保存为key,形成一个坑位,然后右边先开始移动找比key小的数,然后把它往左边的坑位填,然后坑位变成右边的那个下标,然后左边在找比key大的数,然后进行坑位和数字交换,依次类推,到最后相遇的位置
注:把key填入坑位,并且他们相遇点一定是坑
测试挖坑法版本
挖坑版本代码:
思路3:(前后指针版本)【最优】
给定两个指针prev和cur
1、cur找到比key小的值,++prev,cur和prev位置的值交换,++cur
2、cur找到比key大的值,++cur
3.最后把prev上的值和key交换位置
说明:
1、prev要么紧跟着cur(prev下一个就是cur)
2、prev跟cur中间间隔着比key大的一段值区间
测试前后指针法版本
前后指针法版本代码
2.2快速排序的特性总结:
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
2. 时间复杂度:O(N * logN)
3. 空间复杂度:O(logN)
4. 稳定性:不稳定