堆排序

堆排序的时候其实只是把数组想象成完全二叉树,然后进行的调整。

首先提出几个概念和定义。

假设到达某下标,记为i,那么i的左孩子为2* i - 1 ,i的右孩子为2 * i + 2 ,父节点为(i-1)/2。

heapInsert为往上调整(也就是加入的数值,在最低端看看它能不能往上跳),heapfy为向下调整。

所以堆排序的过程就是

①使数组先整体成为一个大根堆;
②把堆顶和堆底交换,heapSize--;
③交换后的原本堆底来到了堆顶,然后进行heapfy,最后让最大的又来到了堆顶;

这样子不断地调整,就把所有最大值不断地调整到数组的最后,达到了排序的效果。

heapInsert

 

 heapfy

 

 堆排序的实现过程

 

 面试题:有一个流不断地吐出数,找到所有数中的中位数

①准备两个数组
一个大根堆,一个小根堆。
小的数/小于小根堆堆顶的数放在大根堆里面,反之大的数/大于大根堆堆顶的数放在小根堆里面;
②当|size大-size小|>1时
大的堆的堆顶弹出

使用优先级队列PriorityQueue,默认小根堆,在coding时要使用比较器。

posted @ 2020-10-03 14:00  拿着放大镜看世界  阅读(102)  评论(0)    收藏  举报