heap-sort
堆的基本操作
heapInsert(插入操作)
当当前节点的值大于其父节点的值时,才会交换二者的值,当index达到堆顶点时,`target[index]=target[(index-1)/2]`,会终止循环
**时间复杂度**
由于堆的高度为$log N$,所以一个数从堆底部到达堆顶只需要交换$log N$次,复杂度即$O(log N)$
> 当数组已经达到最大时,需要将数组扩容才能继续插入数据构建大根堆,假设当前数组长度为1,一次扩大一倍,总共需要扩容$log N$次至N的大小。
当扩容完成后,还需将原数组的数据拷贝至新扩容的数组,是$O(N)$的复杂度,总的扩容复杂度为$O(N*log N)$ ,平均到每个元素,也是$\frac{O(N*log N)}{N}=O(log N)$
### heapify(弹出操作)
{% note info %}
`heapify`仅仅完成调整操作,同样无需关心堆的大小
{% endnote %}
所要做的就是调整index处的值,使堆重新调整大根堆
``` c++
void heapify(vector<int>& target,int index,int heapSize){
auto left = index*2 + 1;
//当左子节点存在时
while(left< heapsize){
//在子节点中挑出大的
auto largest= (left+1)<heapsize && target[left]<target[left+1]? left+1 : left;
//在index和其较大子节点中挑出大的
largest = target[index]< target[largest]? largest:index;
//如果最大的就是index本身,无需继续调整
if(largest == index)
break;
swap(target[targest],target[index]);
//如果最大的值是index子节点,将二者交换,并将index更新为largest
index = largest;
left = index*2 +1;
}
}堆排序
大根堆的构建
堆构建后的排序过程
堆排序复杂度
堆结构
相关问题
Last updated