左神算法基础class2——题目3 堆heapInsert、heapify、堆排序C++实现

本文介绍了堆排序的基础知识,包括完全二叉树和堆的概念。详细讲解了如何通过heapInsert将新节点插入并调整为大根堆,以及heapify过程,用于在数组值变化后重新构建大根堆。最后讨论了堆排序的实现步骤和时间复杂度。
摘要由CSDN通过智能技术生成

1.基础知识

1.完全二叉树有两种:
5
/ \
1 2
/ \ /
3 4 2 6
满二叉树
5
/ \
1 2
/
1
从左到右排序的二叉树
2.完全二叉树可等价为堆,堆可用数组实现
其中第i结点的左孩子:2i+1,第i结点的右孩子:2i+2,第i结点的父节点:(i-1)/2
3.大根堆:指任意子树的最大值是其头部的结点
小根堆:指任意子树的最小值是其头部的结点

2.heapInsert:新结点加入进来并向上调整为大根堆的过程

把数组变为大根堆,建立堆结构

分析

如果当前插入的元素大于其父节点的元素,那么交换父节点与当前节点的位置。接着考察更换结点后的插入元素与新位置的父节点大小,如果还是大于还要继续交换。
eg。例[2,1,3,6]变换为大根堆
位置0,1,2,3
(1)2插入,父节点(0-1)/2 = 0位置,自己和自己不动;
(2)1插入,父节点(1-1)/2 = 0位置,1<2,不动;
(3)3插入,父节点(2-1)/2 = 0位置,3>2,交换位置;此时3的位置变为0,父节点(0-1)/2 = 0位置,自己和自己不动;
此时:
3
/
1 2
(4)6插入,父节点(3-1)/2 = 1位置,6>1,交换位置;此时6的位置变为1,父节点(1-1)/2 = 0位置;6>3,继续交换;
6
/
3 2
/
1

核心代码

(index-1)/2是index父节点的位置

void heapinsert(int arr[],int index)
{
   
	while(arr[index] > arr[(index-1)/2])
	{
   
		swap(arr[index],arr[(index-1)/2]);
		index = (index-1)/2;
	}
}

使用for循环遍历数组,调用heapinsert

for(int i = 0;i < length;i++ )
	{
   
		heapinsert(arr,i);//用for循环传入要处理的index
	}

完整代码

#include<iostream>

#define length 5
using namespace std;

void swap(int &a,int &b)
{
   
	int temp = a;
	a = b;
	b = temp;

}
void heapinsert(int arr[],int index)
{
   
	while(arr[index] > arr[(index-1)/2])
	{
   
		swap(arr[index],arr[(index-1)/2]);
		index = (index-1)/2;
	}
}

int main()
{
   
	//int arr[length] = {2,1,3,6,0,4};
	int arr[length] = {
   3,4<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值