比赛结果公布:
堆排序:
要知道堆排序,首先要了解一下二叉树的模型。
下图就是一颗二叉树,具体的情况我后续会分享的。
那么堆排序中有两种情况(看上图理解):
大根堆: 就是说父节点要比左右孩子都要大。
小根堆: 就是说父节点要比左右孩子都要小。
那么要实现堆排序,必须要做两件事情:
第一:构建大根堆。
首先上图:
首先这是一个无序的堆,那么我们怎样才能构建大根堆呢?
第一步: 首先我们发现,这个堆中有2个父节点(2,,3);
第二步: 比较2这个父节点的两个孩子(4,5),发现5大。
第三步: 然后将较大的右孩子(5)跟父节点(2)进行交换,至此3的左孩子堆构建完毕,
如图:
第四步: 比较第二个父节点(3)下面的左右孩子(5,1),发现左孩子5大。
第五步: 然后父节点(3)与左孩子(5)进行交换,注意,交换后,堆可能会遭到破坏,
必须按照以上的步骤一,步骤二,步骤三进行重新构造堆。
最后构造的堆如下:
第二:输出大根堆。
至此,我们把大根堆构造出来了,那怎么输出呢?我们做大根堆的目的就是要找出最大值,
那么我们将堆顶(5)与堆尾(2)进行交换,然后将(5)剔除根堆,由于堆顶现在是(2),
所以破坏了根堆,必须重新构造,构造完之后又会出现最大值,再次交换和剔除,最后也就是俺们
要的效果了,
发现自己兄弟被别人狂殴,,堆排序再也坐不住了,决定要和快排干一场。
同样,快排也不甘示弱,谁怕谁?
结果公布:
堆排序此时心里很尴尬,双双被KO,心里想,一定要捞回面子,一定要赢,
于是堆排序提出了求“前K大问题”。(就是在海量数据中找出前几大的数据),
快排一口答应,小意思,没问题。
双方商定,在2w随机数中找出前10大的数:
求前K大的输出结果:
最后堆排序赶紧拉着直接选择排序一路小跑了,因为求前K大问题已经不是他原本来的目的。
ps: 直接选择排序的时间复杂度为:O(n^2)
堆排序的时间复杂度:O(NlogN)