改进快排
2016-05-26 19:48
190 查看
1.
选用待排数组最左边、最右边和最中间的三个元素的中间值作为中轴。
(1) 首先,它使得最坏情况发生的几率减小了
(2) 其次,未改进的快速排序算法为了防止比较时数组越界,在最后要设置一个哨点。如果在分区排序时,中间的这个元素(也即中轴)是与最右边数过来第二个元素进行交换的话,那么就可以省略与这一哨点值的比较
2. 根据分区大小调整算法
快速排序算法使用了分治技术,最终来说大的数据集都要分为小的数据集来进行处理。由此可以得到的改进就是,当数据集较小时,不必 继续递归调用快速排序算法,而改为调用其他的对于小规模数据集处理能力较强的排序算法来完成
开始采用快速排序算法进行排序,当递归达到一定深度时就改为堆排序来处理。这样就克服了快速排序在小规模数据集 处理中复杂的中轴选择,也确保了堆排序在最坏情况下O(n log n)的复杂度。
3. 不同的分区方案考虑
尤其是当要分区的所有的元素值都相等是,一般的快速排序算 法就陷入了最坏的一种情况,也即反复的交换相同的元素并返回最差的中轴值。无论是任何数据集,只要它们中包含了很多相同的元素的话,这都是一个严重的问 题,因为许多“底层”的分区都会变得完全一样。
对于这种情况的一种改进办法就是将分区分为三块而不是原来的两块:一块是小于中轴值的所有元素,一 块是等于中轴值的所有元素,另一块是大于中轴值的所有元素。另一种简单的改进方法是,当分区完成后,如果发现最左和最右两个元素值相等的话就避免递归调用 而采用其他的排序算法来完成。
选用待排数组最左边、最右边和最中间的三个元素的中间值作为中轴。
(1) 首先,它使得最坏情况发生的几率减小了
(2) 其次,未改进的快速排序算法为了防止比较时数组越界,在最后要设置一个哨点。如果在分区排序时,中间的这个元素(也即中轴)是与最右边数过来第二个元素进行交换的话,那么就可以省略与这一哨点值的比较
2. 根据分区大小调整算法
快速排序算法使用了分治技术,最终来说大的数据集都要分为小的数据集来进行处理。由此可以得到的改进就是,当数据集较小时,不必 继续递归调用快速排序算法,而改为调用其他的对于小规模数据集处理能力较强的排序算法来完成
开始采用快速排序算法进行排序,当递归达到一定深度时就改为堆排序来处理。这样就克服了快速排序在小规模数据集 处理中复杂的中轴选择,也确保了堆排序在最坏情况下O(n log n)的复杂度。
3. 不同的分区方案考虑
尤其是当要分区的所有的元素值都相等是,一般的快速排序算 法就陷入了最坏的一种情况,也即反复的交换相同的元素并返回最差的中轴值。无论是任何数据集,只要它们中包含了很多相同的元素的话,这都是一个严重的问 题,因为许多“底层”的分区都会变得完全一样。
对于这种情况的一种改进办法就是将分区分为三块而不是原来的两块:一块是小于中轴值的所有元素,一 块是等于中轴值的所有元素,另一块是大于中轴值的所有元素。另一种简单的改进方法是,当分区完成后,如果发现最左和最右两个元素值相等的话就避免递归调用 而采用其他的排序算法来完成。
相关文章推荐
- 30天C#基础巩固------了解委托,string练习
- 抓包工具 Wireshark 使用简介
- 哈希函数
- Python 自动刷博客浏览量
- tomcat能正常启动,但是不能访问http://localhost:8080
- Python 自动刷博客浏览量
- shell study-Shell脚本编程的常识(这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用)
- Androin学习笔记五十二: SQLiteCursor(示例,出错代码)
- POJ 1182 食物链(并查集)
- webstorm快捷键
- bat处理打开关闭exe
- Unity3D中各种Path
- 带参数的存储过程
- poll实现IO复用,TCP通信
- MySql入门
- MySql入门
- MySql入门
- 利用YCSB工具对mongodb进行压测
- gulp笔记
- HibernateUt Hibernate帮助类 -----Hibernate_2