普林斯顿算法part1--堆--笔记 2018年4月20到4月27
这周学习了优先队列,最重要的操作是删除最大元素和插入元素。类包括创建优先队列的构造函数、向优先队列中插入一个元素、返回最大元素、删除最大元素、判断队列是否为空、返回优先队列中的元素个数。当二叉树的每个结点都大于等于它的两个子结点时为堆有序,那么根结点是堆有序的二叉树中的最大结点。使用二叉堆就可以用数组代替指针。
实现: 无序数组:用选择排序内循环删除最大元素,但使其有序会使后续删除更高效,但有序后,插入所需要的时间在最坏情况下为N。有序数组:类似栈的pop()操作。
关于堆的算法:如果堆的有序状态因为某个结点变得比它的父节点更大而被打破,那么就交换它和它的父节点,类推。如果堆的有序状态因为某个结点变得比它的两个子结点的一个或全部更小,就将它和它子结点中的较大的结点交换。如果要插入新的元素,可以插入到根结点后向下沉,。如果要删除根结点,就用最后一个元素代替根结点的位置,然后下沉