二叉堆

二叉堆

  • 逻辑上是一个完全二叉树,但是这个二叉树每个结点的val>=子节点(大堆)或者val<=子节点(小堆)
  • 物理上顺序存储空间(数组)
  • 已知parent节点,左孩子为2*parent+1,右孩子为2*parent+2.已知child节点,双亲结点为(child-1)/2

定义

typedef struct Heap
{
	DataType* _array;
	int _capacity;
	int _size;
}Heap;

创建

//向下调整堆
void AdjustDown(int array[], int size, int parent){
	//完全二叉树没有左孩子一定没有右孩子
	while (1){
		int left = 2 * parent + 1;
		if (left >= size){
			return;
		}
		int right = 2 * parent + 2;
		int min = left;
		if (array[left] > array[right] && right < size)
		{
			min = right;
		}
		if (array[min]>array[parent])
			return;
		int t = array[min];
		array[parent] = array[min];
		array[min] = t;
		parent = min;
	}
}
void CreatHeap(int* array, int size){
	//最后一个非叶子节点 = 最后一个节点的双亲节点
	for (int i = ((size - 1) - 1) / 2; i >= 0; i--){
		AdjustDown(array, size, i);
	}
}
void InitHeap(Heap* heap, int * array, int size){
	memcpy(heap->_array, array, sizeof(int)*size);
	heap->_size = size;
	CreatHeap(heap->_array, size);
}

尾插

void AdjustUp(int* array, int child){
	while (child!=0){
		int parent = (child - 1) / 2;
		if (array[parent] <= array[child]){
			return;
		}
		int t = array[child];
		array[child] = array[parent]; 
		array[parent] = t;
		child = parent;
	}
}
void HeapPush(Heap* heap, int v){
	heap->_array[heap->_size++] = v;
	AdjustUp(heap->_array, heap->_size, heap->_size - 1);

}

尾删

void HeapPop(Heap* heap){
	AdjustDown(heap->_array, heap -> _size - 1, 0);
	heap->_size--;
}

返回堆顶元素

int HeapTop(Heap* heap){
	return heap->_array[0];
}

堆排序

排升序大堆,降序小堆

void HeapSort(int arr[],int size){
    CreatHeap(arr,size);
    for(int i =0;i<size-1;i++){
        int t = arr[0];
        arr[0] = arr[size-i-1];
        arr[size-i-1] = t;//交换堆顶和堆尾
        AdjustDown(arr,size-i-1,0);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉堆是一种特殊的二叉数据结构,它满足以下两个条件: 1. 父节点的总是大于或等于(或小于或等于)其节点的。 2. 二叉堆是一棵完全二叉,即除了最底层,其他层的节点个数都是满的,并且最底层的节点都尽可能地左对齐。 在Python中,我们可以使用内置的heapq模块来实现二叉堆。heapq模块提供了一些函数来操作堆,例如heappush、heappop、heapify等。 以下是一个简单的示例代码,演示如何使用heapq模块来构建和操作二叉堆: ```python import heapq # 创建一个空的二叉堆 heap = [] # 向堆中插入元素 heapq.heappush(heap, 5) heapq.heappush(heap, 2) heapq.heappush(heap, 10) heapq.heappush(heap, 1) # 弹出堆中的最小元素 min_element = heapq.heappop(heap) print(min_element) # 输出: 1 # 查看堆中的最小元素(不弹出) min_element = heap[0] print(min_element) # 输出: 2 # 将列表转换为堆 nums = [4, 8, 3, 6, 1] heapq.heapify(nums) # 弹出堆中的最小元素 min_element = heapq.heappop(nums) print(min_element) # 输出: 1 ``` 上述代码中,我们首先创建了一个空的二叉堆,然后使用heappush函数向堆中插入元素。通过heappop函数,我们可以弹出堆中的最小元素。如果只是查看最小元素而不弹出,可以直接访问heap[0]。还可以使用heapify函数将一个普通的列表转换为二叉堆。 希望这个简单的示例能帮助你理解Python中二叉堆的概念和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值