最近刷笔试题的时候遇到:某堆初始化的结果,某堆排序后的结果。
之前学数据结构的时候已经学过,然而没有牢固的影响,在这里做笔记。以免自己再忘却。
首先,堆是完全二叉树却不是二叉查找树。
所以对堆进行初始化,只是找出了第一个最大的(最大堆),或者最小的值(最小堆)。
举个例子:设有一个无序序列 { 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 }。(接下来参考大佬的博客的图)
很明确的看出来:
先建立一个完全二叉树。
建树之后按照从最后往前的顺序,不断的进行一个选择交换。
最终找到了最大的交换到了根节点。(这也就是为什么堆排序是选择排序。它都是每次找到最大或者最小)
上面就完成了堆的初始化。
所以初始化后的序列【9,8,6,7,2,1,4,3,5,0】
而接下来整个堆排序的过程大概如下:
1.把根节点和末尾结点交换,并且弹出末尾点。 所以弹出9,这个9就存储进了数组里。 数组第一个值(最大值)就排序好了。
2.接下来按照初始化的方法,继续排序。
重复1··2 一直到堆为空。
至此,每次弹出去的都是最大值,9,8,7,6·······
整个数组堆排序完成。
详细图如下: