可以从列表中以O(n logn)时间构造一个堆,因为将元素插入到堆中需要O(logn)时间,并且有n个元素。
类似地,可以从O(n logn)时间的列表中构造二叉搜索树,因为将元素插入BST需要平均logn时间,并且有n个元素。
从最小到最大遍历一个堆需要O(n logn)时间(因为我们必须弹出n个元素,并且每次弹出都需要一个O(logn)接收器操作)。从最小到最大遍历BST需要O(n)时间(实际上只是顺序遍历)。
因此,在我看来,构造这两种结构需要花费相同的时间,但是BST的迭代速度更快。那么,为什么我们使用“Heapsort”而不是“BSTsort”呢?
编辑:感谢Tobias和lrlreon的回答!总之,以下是我们使用堆而不是BST进行排序的要点。
最佳答案
如果排序方法包括将元素存储在数据结构中并以排序方式提取后,则尽管这两种方法(堆和bst)都具有相同的渐近复杂度O(n log n),但堆往往会更快。原因是堆始终是一棵完美平衡的树,并且其操作始终是确定性方式的O(log n),而不是平均水平。对于bst,取决于使用哪种平衡方法,无论使用哪种平衡方法,插入和删除操作都比堆花费更多的时间。另外,通常使用存储树的级别遍历的数组来实现堆,而无需存储任何类型的指针。因此,如果您知道元素的数量(通常是这种情况),那么堆所需的额外存储空间将少于bst所使用的存储空间。
在对数组进行排序时,有一个非常重要的原因,它比bst更适合作为堆:您可以使用相同的数组来存储堆;可以使用相同的数组来存储堆。无需使用额外的内存。
关于sorting - 为什么我们通过堆而不是二进制搜索树进行排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47971807/