优先队列(堆排序)
优先队列:最重要的操作就是删除最大元素和插入元素
堆排序:堆排序对于记录较少的文件效果一般,对于文件较多还是比较有效的,最差的时间复杂度为nlog(n),属于不稳定排序
堆排序可以被认为是一种改进的选择排序:就像选择算法一样,它将输入分成已排序的和还未排序的区域,它通过提取未排序的区域内最大的元素并将其移动到已排序的区域来迭代缩小未排序的区域。堆排序相对选择排序改进的部分包括使用堆数据结构而不是线性时间的搜索来找到最大值。摘于知乎:堆排序
步骤:
输入:一系列的无序元素(比如说,数字)组成的输入数组A
经过:堆排序的过程可以具体分为三步,创建堆,调整堆,堆排序。
创建堆,以数组的形式将堆中所有的数据重新排序,使其成为最大堆/最小堆。
调整堆,调整过程需要保证堆序性质:在一个二叉堆中任意父节点大于其子节点。
堆排序,取出位于堆顶的第一个数据(最大堆则为最大数,最小堆则为最小数),放入输出数组B 中,再将剩下的对作调整堆的迭代/重复运算直至输入数组 A中只剩下最后一个元素。
输出:输出数组B,里面包含的元素都是A 中的但是已经按照要求排好了顺序
# python中heapq堆使用
importheapq
list = [1,2,3,5,1,5,8,9,6]
heapq.heapify(list)
代码参考:
公众号:算法手记