快速排序
与归并排序一样, 快排也是用了分治的思想。
特别注意 : 快排的核心模块是Partition, 而Partition的复杂度为O(N).
你可以想象一个两副牌然后随意取出一张牌pivot,其他的所有牌都跟这张pivot牌比较,
大的放右边那一摞A,小的放左边B。
接着再从左边这一摞B再随意取出一张牌pivot,其他的所有牌都跟这张pivot牌比较,
大的放右边那一摞,小的放左边,递归下去。
A也重复上述步骤递归。
递归结束之后, 左边的都比右边的小, 而且是有序的。
效率很差的情况
对于分治算法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。也就是说,基准的选择是很重要的。选择基准的方式决定了两个分割后两个子序列的长度,进而对整个算法的效率产生决定性影响
所以当如果一个有序递增序列, 每次选基准都选最后一个, 那肯定效率很差了啊
算法导论的快排C++实现版本
这个c++实现版本主要用于说明算法思想, 而对于代码鲁棒性有太多关注,
下面有个我自己手写的命名清晰版本会比较多的关注鲁棒性以及易读性
1 | void swap(int *a, int *b) |