堆排序
堆排序的时候其实只是把数组想象成完全二叉树,然后进行的调整。
首先提出几个概念和定义。
假设到达某下标,记为i,那么i的左孩子为2* i - 1 ,i的右孩子为2 * i + 2 ,父节点为(i-1)/2。
heapInsert为往上调整(也就是加入的数值,在最低端看看它能不能往上跳),heapfy为向下调整。
所以堆排序的过程就是
①使数组先整体成为一个大根堆;
②把堆顶和堆底交换,heapSize--;
③交换后的原本堆底来到了堆顶,然后进行heapfy,最后让最大的又来到了堆顶;
这样子不断地调整,就把所有最大值不断地调整到数组的最后,达到了排序的效果。
heapInsert

heapfy

堆排序的实现过程

面试题:有一个流不断地吐出数,找到所有数中的中位数
①准备两个数组 一个大根堆,一个小根堆。 小的数/小于小根堆堆顶的数放在大根堆里面,反之大的数/大于大根堆堆顶的数放在小根堆里面; ②当|size大-size小|>1时 大的堆的堆顶弹出
使用优先级队列PriorityQueue,默认小根堆,在coding时要使用比较器。
浙公网安备 33010602011771号