实现堆排序的思路:
1.对与堆排序我们不必先去实现一个堆,将数组的元素一个一个插进去,我们可以知道数组是一个完全二叉树的结构,所以可以直接在数组上建堆。
2.如果是排升序,我们可以建小堆找出最小的数。
找到最小的数为10,如何找到次小的数呢?如果从12开始剩下的看作一个堆,之前建立的堆关系就全都乱了,这时需要重新建立小堆,才能选出次小的数!这样的效率太低了!
换一种思路,我们建大堆排升序。建大堆选出最大的数,将最大的数与最后一个数交换,把最后一个数不看做堆里,从堆顶向下调整,以此类推就实现排序了。(如果我们要实现降序的话就是建一个小堆。改为建小堆只需要将向下调整函数中的选择交换哪一个数的条件改为小于)。
堆排序的实现:
#include <stdio.h>
#include<assert.h