今天文章的内容是关于我们如何利用堆的特性对我们的数组进行排序,还有就是我们的TopK的问题,这次我们放在的是文件种,我们放入一亿个数字,然后我们取出一亿个数字中最大的十个数,利用上章堆的问题进行解决。
首先就是我们如果对一个数组要进行排序,这个数组是没有任何规律的,就像下面的这个数组。
那我们得利用我们堆的特性,因为我们知道堆的特性,首先堆顶的数据一定是最小的,那我们要进行排序之前的话,要做的一个最重要的步骤就是先建立一个堆出来,我们可以用两种方法,一种是向上建堆,另一种就是向下建堆,这两个方法我们都会讲。
向上建堆
首先我们这里给的例子是升序,但是在升序的时候,我们是建立大堆还是小堆呢?答案是,那我们先来看看减小堆的时候,会产生怎样的问题,再来看看大堆,两者相互比较之后,我们就会发现升序就应该建立大堆。
首先就是复用我们上次堆的内容的向上建堆的那个方法,就是,如果这里大家不明白可以回头看看,我这里直接给出代码。
我们可以看到这是向上调整,那我们建堆的过程是不是从二叉树的第二层开始往上建堆,比较的就是孩子和父亲的关系,那我们这里就可以写一个循环来完成这个建立堆的过程。
然后我们这个过程建立出来堆的样子就是我们的小堆
那我们的代码就是下面这个,其实代码很简答的主要可能难理解。
这个就是AdjustDown的代码,再堆里讲过,这样就不将了,来看我们如何进行排序的部分
end = 0的时候就说明已经排序好了,所以这个就是判断条件,然后来看我们的end一开始就是指向最后一个元素,因为是数组,所以这里表示的就是下标,我们这里就是要注意这个,然后先是交换堆顶元素和最后一个元素的问题,就直接开始调整,但是调整的时候我们end并没有进行–,因为的size位置的参数表示的就是元素个素,然后我们调整的时候因为最后一个元素已经有序了,所以就不用在进行调整了。
还有一个TopK问题放在下一篇文章里,因为这样流量多哈哈哈哈哈,下篇文章见。