我想说的不是内存中的堆空间,这里的堆只是一种组织方式,采用的是用完全二叉树的形式来表示一维数组,就是说如果是一个大顶堆的话,根部的数是最大的,从根部开始,一层一层对应数组,例如数组int a[6]={6,5,4,3,2,1},a[0]是根部,a[1] 是左子节点,a[2]是右子节点,。。。。。。
如果要对一个一维数组进行堆排序的话,首先要把这个一维数组初始化为一个大顶堆,或者是一个小顶堆,用的时间0(n),看c++算法分析,然后对于一个个数为n的堆,数的高度为log2 n+1,则每次删除根部后,平均移动的时间0(log2 n),所以堆排序的时间O(n*log2 n),小于O(n*n)。
具体分析:
删除:删除根部后,然后比较它的两个子节点,找到最大后放到根部,然后依次下去比较直到结束。
初始化堆:从n/2到1,作为根部,进行排序。
具体,看c++算法分析。