博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么快排比堆排快
阅读量:4114 次
发布时间:2019-05-25

本文共 656 字,大约阅读时间需要 2 分钟。

今天作算法排序实验,发现相同的数据规模,快速排序比堆排序的效率高很多,并且随着数据规模的扩大,二者的差距不断扩大,快速排序的优势越来越明显。快速排序的时间复杂度近似线性增长,堆排序则要大很多。究其原因,应该有以下几个方面:

        在堆排序(小根堆)的时候,每次总是将最小的元素移除,然后将最后的元素放到堆顶,再让其自我调整。这样一来,有很多比较将是被浪费的,因为被拿到堆顶的那个元素几乎肯定是很大的,而靠近堆顶的元素又几乎肯定是很小的,最后一个元素能留在堆顶的可能性微乎其微,最后一个元素很有可能最终再被移动到底部。在堆排序里面有大量这种近乎无效的比较。随着数据规模的增长,比较的开销最差情况应该在(线性*对数)级别,如果数据量是原来的10倍,那么用于比较的时间开销可能是原来的10log10倍。

        堆排序的过程中,需要有效的随机存取。比较父节点和字节点的值大小的时候,虽然计算下标会很快完成,但是在大规模的数据中对数组指针寻址也需要一定的时间。而快速排序只需要将数组指针移动到相邻的区域即可。在堆排序中,会大量的随机存取数据;而在快速排序中,只会大量的顺序存取数据。随着数据规模的扩大,这方面的差距会明显增大。在这方面的时间开销来说,快速排序只会线性增长,而堆排序增加幅度很大,会远远大于线性。

        在快速排序中,每次数据移动都意味着该数据距离它正确的位置越来越近,而在堆排序中,类似将堆尾部的数据移到堆顶这样的操作只会使相应的数据远离它正确的位置,后续必然有一些操作再将其移动,即“做了好多无用功”。

        附:相关文章链接:

        

        

        

转载地址:http://vagsi.baihongyu.com/

你可能感兴趣的文章
黑马程序员——OC语言 内存管理
查看>>
C#基于引用创建单链表
查看>>
C/C++程序的存储空间布局
查看>>
ccf201703-1分蛋糕
查看>>
git reset
查看>>
中文词频统计
查看>>
SAP常用事务代码
查看>>
性能优化
查看>>
js中const,var,let区别
查看>>
iOS Core Animation 动画 入门学习(一)基础
查看>>
学习笔记(一、二)
查看>>
数组排序于数组去重
查看>>
BeanFactory和ApplicationContext的简单介绍
查看>>
mysql手册操作
查看>>
vim使用心得(持续更新)
查看>>
PC端上必应词典与金山词霸的测评分析
查看>>
UIKit类结构图
查看>>
Python2在Sublime Text3中print中文时报错原因及解决办法
查看>>
Objective - C基础: 第一天 - 8.OC对象与函数
查看>>
通讯录 、 传感器
查看>>