正文
2.4 优先级队列和堆排序
。实际上优先级队列是非常有用的抽象数据类型,有一篇小论文说到荒岛上你会带什么唯一的抽象数据类型,答案就是优先级队列。
论文名:
If you were lost on a desert island, what one ADT would you like to have with you?
优先级队列可以实现栈,也可以实现队列,只需要用时间为优先级即可。
优先级队列的变化还是相当多的,可以深入了解这方面的知识,例如可以参考Handbook of Data Structures and Applications。有了优先级队列之后,接着讲堆排序,这里不再多说。
2.5 这节的关键是该使用哪种排序算法
,什么时候用什么排序,这个问题很重要。排序讲到这里就结束了,最有用的就是三种:归并排序、快速排序和堆排序,讲得很简化。
实际上,学堆排序更大的用处是为了让你了解和掌握优先级队列这种抽象数据类型。快速排序是为了让你了解随机化算法。归并排序是外存算法,尽可能少做内外存交换(但不可能完全用内存处理)。
也就是说,我们从排序这章要学一些算法思维和工程思想。
排序和查找为何如此重要,Knuth在《计算机程序设计艺术》第3卷提到大多数主机的时间都在进行排序和查找,而查找对于我们来说更为常见。查找部分的内容首先从符号表开始,所谓符号表就是一个"键—值"的集合,而查找就是用键去查值。
3.2 二叉查找树和3.3 平衡查找树
,第一种思路是最坏时间所有操作都能在对数时间内完成的树查找结构,一般要完成插入、删除和查找,它们都可以在对数时间内完成。先用二叉查找树,但是它在最坏情况下达不到对数时间而退化成链表,基本原因是不平衡,也就是树太高了。为了平衡用了两种方法就是2-3树和红黑树,有的书上会讲AVL树但
《算法(第4版)》