【自制演示代码】Basic Operations on a Binary Min-Heap

Properties of a Binary Min-Heap

1. Structure Property

A binary min-heap has to be a complete binary tree.

2. Heap Order Property

The value of any node in a binary min-heap has to be no greater than its two children's values(if exists).

Operations Included in the Code

In the following code, you will see the operations below:

- BuildHeap

- PercolateDown

- PercolateUp

- Insert

- DeleteMin

- PrintHeap

Also, you will see the simple typedef of:

- Heap

Notes and Declarations

The code will sort the input sequence with a heap.

The language used is C.

The purpose of posting this code online is to make a quick note of my studying progress.

For students at school, DO NOT copy this code into your homework or projects. Otherwise, I will not be responsible for any punishments because of this.

Some bugs might be included in the code. The author(I) will NOT be responsible for any results brought out from this code.

Code

/* Operations on a Binary Min Heap */
#include <stdio.h>
#include <stdlib.h>

#define MAXN_SIZE 128

typedef struct Heap
{
	int Size;
	int *Elements;
}Heap;

void PercolateDown( Heap *H, int index );
void PercolateUp( Heap *H, int index );
void Insert( Heap *H, int value );
int DeleteMin( Heap *H );
Heap BuildHeap( int size, int *seq );
void PrintHeap( Heap H );

int main()
{
	printf("SORT BY HEAP\n");
	printf("To build a heap, how many numbers do you want?\n>>>");
	
	int size = 0;
	int i = 0;
	
	scanf("%d", &size);
	
	int *seq = (int *)malloc(sizeof(int *) * size);
	
	printf("Please input your numbers:\n>>>");
	
	for (i = 0; i < size; i++)
	{
		scanf("%d", &seq[i]);
	}
	
	Heap heap = BuildHeap(size, seq);
	
	printf("Heap built!\n");
	
	while (heap.Size > 0)
	{
		//PrintHeap(heap);
		printf("%d ", DeleteMin(&heap));
	}
	
	return 0;
	
}


void PercolateDown( Heap *H, int index )
{
	int i = 0, LastElement = H->Elements[index];
	int Child = 0;
	
	for (i = index; i * 2 <= H->Size; i = Child)
	{
		Child = i * 2;
		if (Child != H->Size && H->Elements[Child + 1] < H->Elements[Child])
		{
			// Right child exists and is smaller than the left one
			Child += 1;
		}
		if (LastElement > H->Elements[Child])
		{
			// Copy the smaller child's value upwards
			H->Elements[i] = H->Elements[Child];
		}
		else
		{
			// The iteration is enough
			break;
		}
	}
	
	H->Elements[i] = LastElement;
}

void PercolateUp( Heap *H, int index )
{
	int targ_key = H->Elements[index];
	int i = 0;
	
	for (i = index; i > 1 && H->Elements[i / 2] > targ_key; i /= 2)
	{
		H->Elements[i] = H->Elements[i / 2];
	}
	
	H->Elements[i] = targ_key;
}

void Insert( Heap *H, int value )
{
	H->Size += 1;
	
	if (H->Size >= MAXN_SIZE)
	{
		printf("OVERSIZING OCCURRED. INSERTION FAILED.\n");
		return;
	}
	
	H->Elements[H->Size] = value;
	
	PercolateUp(H, H->Size);
}

int DeleteMin( Heap *H )
{
	int minn = H->Elements[1];
	
	H->Elements[1] = H->Elements[H->Size];
	H->Size -= 1;
	
	PercolateDown(H, 1);
	
	return minn;
}

Heap BuildHeap( int size, int *seq )
{
	
	Heap res;
	int i = 0;
	
	
	res.Size = size;
	res.Elements = (int *)malloc(MAXN_SIZE * sizeof(int *));
	
	for (i = 1; i <= size; i++)
	{
		res.Elements[i] = seq[i - 1];
	}
	
	
	for (i = res.Size / 2; i >= 1; i--)
	{
		PercolateDown(&res, i);
	}
	
	return res;
}

void PrintHeap( Heap H )
{
	int i = 0, s = H.Size;
	
	for (i = 1; i <= s; i++)
	{
		printf("%d ", H.Elements[i]);
	}
	
	printf("\n");
	return;
}

<think>好的,我现在需要回答用户关于二叉最小的实现和属性的问题。首先,我要回忆一下二叉的基本概念。二叉是一种完全二叉树,最小的特点是每个节点的值都小于或等于其子节点的值。这意味着根节点是整个中的最小值。 接下来,用户提到了实现方法。我需要考虑如何用数组来表示二叉,因为完全二叉树可以用数组高效地存储。例如,父节点和子节点的索引可以通过公式计算出来。比如父节点的索引是$(i-1)/2$,左子节点是$2i+1$,右子节点是$2i+2$。这些公式在代码中会经常用到,比如在插入或删除元素时调整的结构。 然后,我需要介绍最小的基本操作,如插入和提取最小值。插入操作通常是将新元素放在数组末尾,然后通过上浮(percolate up)操作调整位置,直到满足的性质。提取最小值则是取出根节点,然后将最后一个元素移到根的位置,再进行下沉(percolate down)操作,确保的性质不被破坏。 属性方面,二叉的时间复杂度是关键点。插入和提取操作的时间复杂度都是$O(\log n)$,而获取最小值是$O(1)$,因为可以直接访问根节点。另外,的构建可以通过Floyd算法在$O(n)$时间内完成,这可能也是用户感兴趣的内容。 用户提供的引用中提到了父节点和子节点的函数实现,这部分代码可以作为示例展示。同时,引用[2]提到属性可能来自其他jar文件,但这里可能是指的属性,比如结构特性和操作复杂度,需要明确区分。 还需要注意用户可能对的应用场景感兴趣,比如优先队列、排序等。不过用户的问题主要集中在实现和属性上,可能需要简要提及应用以增强理解。 最后,要确保回答结构清晰,分点说明实现步骤和属性,并给出代码示例。同时,按照要求生成相关问题,帮助用户进一步学习。</think>### 二叉最小的实现与特性 #### 1. 基本概念 二叉最小是一种**完全二叉树**,满足每个节点的值均小于或等于其子节点的值。这一性质称为**最小性质**,保证了根节点是全局最小值。 #### 2. 核心实现方法 **(1) 存储结构** 使用数组表示完全二叉树,索引关系如下: - 父节点索引:$ \text{parent}(i) = \lfloor (i-1)/2 \rfloor $ - 左子节点索引:$ \text{left\_child}(i) = 2i + 1 $ - 右子节点索引:$ \text{right\_child}(i) = 2i + 2 $ **(2) 关键操作** ```python class MinHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def insert(self, key): self.heap.append(key) i = len(self.heap) - 1 # 上浮操作维护性质 while i > 0 and self.heap[i] < self.heap[self.parent(i)]: self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i] i = self.parent(i) def extract_min(self): if not self.heap: return None min_val = self.heap[0] self.heap[0] = self.heap[-1] self.heap.pop() # 下沉操作维护性质 self._heapify(0) return min_val def _heapify(self, i): left = 2 * i + 1 right = 2 * i + 2 smallest = i if left < len(self.heap) and self.heap[left] < self.heap[smallest]: smallest = left if right < len(self.heap) and self.heap[right] < self.heap[smallest]: smallest = right if smallest != i: self.heap[i], self.heap[smallest] = self.heap[smallest], self.heap[i] self._heapify(smallest) ``` #### 3. 重要属性 1. **结构特性** 完全二叉树结构保证高度为$ \lfloor \log n \rfloor $,支持高效操作[^1]。 2. **时间复杂度** - 插入元素(`insert`): $O(\log n)$ - 提取最小值(`extract_min`): $O(\log n)$ - 获取最小值(`get_min`): $O(1)$ [^1] 3. **构建优化** 可通过Floyd算法在$O(n)$时间内将无序数组构建为:从最后一个非叶子节点开始反向执行`_heapify`。 #### 4. 应用场景 - 优先队列实现 - 排序算法 - 图算法(如Dijkstra最短路径)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值