本文首发于本人CSDN博客,禁止转载
版权声明:本文为CSDN博主「NMG_CJS」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/NMG_CJS/article/details/102876856blog.csdn.net简介
快速排序与归并排序一样也是一种分治递归算法,其排序(升序)步骤可以简述如下:
1、在待排元素集合N中任选一元素做为枢纽元
2、开始分割元素,使左部元素均小于枢纽元,右部元素均大于枢纽元
3、对左右子序列递归应用步骤1、2
1、选取枢纽元
有一种极其常见的、错误的、非常糟糕的枢纽元的选取,是选取数组第一个或者最后一个元素为枢纽元,如果输入序列是随机的那么上述做法可以接受,但如果输入的序列与我们要排的序列正好相反,那么在分割元素阶段就会出现所有元素被划分到左半部或者右半部,更糟糕的是,在其后续递归过程中也是如此,那么其排序花费的时间将是二次的,因此该种枢纽元的选取应该摒弃。
void
那么我们该如何选取枢纽元呢?有两种常见的做法,一种是使用随机数生成器随机选取(但我们要注意到随机数的选取是昂贵的),另一种做法是选取3个数的中位数,这种选取方式总的来说是好的稳妥的,如下:
void
2、分割策略
分割所做的事就是将小元素移动到数组左边,大元素移动到数组右边,一种安全稳妥的分割策略是,选取枢纽元之后将其与最后一个元素交换,然后对第0个元素和倒数第二个元素分割,因为没有必要对枢纽元进行分割,故将其移动到最后进行隐藏,具体分割步骤如下:
上述分割策略摘自数据结构与算法分析第二版page180
3、代码实现
#define Cutoff (3)
参考文献
数据结构与算法分析第二版