算法: 堆排序
堆分析
堆排序适合于求”前K大问题” 海量输出中找出前几大数据堆排序->二叉树模型 父节点 (3) / \ / \ (2) (1) 左孩子 右孩子
堆排序两种情况
大根堆:父节点要比左右孩子都大
小根堆:父节点要比左右孩子都小
堆排序需要做两件事:
第一:构建大根堆(3) / \ / \ (2) (1) / \ / \ (4) (5)
上面的树是一个无序堆,构建大根堆步骤如下:
第一步:首先找到堆中的2个父节点(2,3);
第二步:比较2这个父节点的两个孩子(4,5),发现5大
第三步:将较大的右孩子(5)跟父节点(2)进行交换,至此3的左孩子对构建完成,
如下所示(3) / \ / \ (5) (1) / \ / \ (4) (2)
第四步:比较第二个父节点(3)下面的左右孩子(5,1),发现左孩子5大
第五步:然后父节点(3)与左孩子(5)进行交换,注意,交换后,堆可能会遭到破坏,
按照以上步骤一,步骤二,步骤三进行重新构造堆。最后构造的堆如下
(5) / \ / \ (4) (1) / \ / \ (3) (2)
第二:输出大根堆
至此,我们把大根堆构造出来了,那怎么输出呢?我们做大根堆的目的就是要找出最大值,
那么我们将堆顶(5)与堆尾(2)进行交换,然后将(5)剔除根堆,由于堆顶现在是(2),
所以破坏了根堆,必须重新构造,构造完之后又会出现最大值,再次交换和剔除,最后也就
是要的效果构建堆heapAdjust
@param list 数组(待排序集合)
@param parent 父节点
@param lenght 输出根堆时剔除最大值使用
1 | function heapAdjust(list, parent, length) { |
- 堆排序heapSort
@param list 待排序数组
@param top 前K大
1 | function heapSort(list, top) { |
- 调用
1 | //获取一个随机数组 |