用数组实现一个简单的heap(最大堆)结构

make_heap函数用来从给定的任意顺序的数组创建一个最大堆。

push_heap函数向堆中压入一个新的数据,并维持堆的形态。

pop_heap函数取出堆中最大的元素,并将该元素从堆结构中剔除,维持堆的形态。


使用了定长数组作为基本的存储数据的结构,当数组空间满时,重新申请一个两倍长于当前数组的新数组,将元素复制过去。

heap.cpp

class heap
{
private:
	int *_A;
	int _size;	//当前元素数量
	int _max_size;	//所能容纳的最大数量
	void _adjust_heap(int i)
	{
		int left = 2 * i + 1;
		int right = 2 * i + 2;
		int largest;
		//选出三个节点中最大的元素,将他放到根节点中
		if(left <= _size - 1 && _A[left] > _A[i])
			largest = left;
		else
			largest = i;

		if(right <= _size - 1 && _A[right] > _A[largest])
			largest = right;

		if(largest != i)
		{
			int tmp = _A[i];
			_A[i] = _A[largest];
			_A[largest] = tmp;

			_adjust_heap(largest);
		}
	}
	void _double_heap()
	{
		int *tmp = new int[_size * 2];
		for(int i = 0; i < this->_size; i++)
		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: def heap_sort(arr): n = len(arr) # 建立最大堆 for i in range(n//2 - 1, -1, -1): heapify(arr, n, i) # 将 arr[0] 与 arr[i] 交换,再堆化 for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) def heapify(arr, n, i): # 初始化最大值为根节点 largest = i l = 2 * i + 1 # 左子节点 r = 2 * i + 2 # 右子节点 # 如果左子节点比根节点大,将最大值更新为左子节点 if l < n and arr[i] < arr[l]: largest = l # 如果右子节点比最大值大,将最大值更新为右子节点 if r < n and arr[largest] < arr[r]: largest = r # 如果最大值不是根节点,将根节点与最大值交换 if largest != i: arr[i],arr[largest] = arr[largest],arr[i] # 递归堆化 heapify(arr, n, largest) 函数 heap_sort() 使用上面定义的 heapify() 函数实现堆排序算法。 ### 回答2: 堆排序是一种基于比较的排序算法,它利用堆这种数据结构进行排序。堆被定义为一个完全二叉树,其中每个父节点的值都大于或等于其子节点的值(最大堆),或者每个父节点的值都小于或等于其子节点的值(最小堆)。 以下是使用Python实现堆排序的代码: ```python def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) # 构建最大堆(从最后一个非叶子节点开始) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 逐个将堆顶元素移动到末尾,并调整剩余堆 for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) # 测试代码 arr = [12, 11, 13, 5, 6, 7] heapSort(arr) print("排序结果:") for i in range(len(arr)): print("%d" % arr[i], end=" ") ``` 以上代码中,`heapify`函数用于调整某个节点及其子节点使之满足堆的性质,`heapSort`函数用于对给定数组进行堆排序。首先,使用`heapify`函数构建一个最大堆。然后,将堆顶元素与数组末尾元素交换,并调整剩余堆。重复这个过程直到整个数组有序。最后,输出排序结果。 运行上述代码,将输出以下结果: ``` 排序结果: 5 6 7 11 12 13 ``` 此即为使用Python实现的堆排序代码。 ### 回答3: 堆排序是一种非常高效的排序算法,它利用堆的性质进行排序。下面是一个用Python实现的堆排序的代码: ```python def heapify(arr, n, i): largest = i # 初始化父节点为最大值 left = 2 * i + 1 # 左孩子节点 right = 2 * i + 2 # 右孩子节点 # 如果左孩子大于父节点,更新最大值位置 if left < n and arr[i] < arr[left]: largest = left # 如果右孩子大于父节点和左孩子,更新最大值位置 if right < n and arr[largest] < arr[right]: largest = right # 如果最大值位置不是父节点,则交换父节点和最大值 if largest != i: arr[i],arr[largest] = arr[largest],arr[i] # 交换元素 # 递归地对子树进行堆化 heapify(arr, n, largest) def heapSort(arr): n = len(arr) # 构建最大堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 一个一个从堆中取出元素 for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # 交换元素 heapify(arr, i, 0) # 使用示例 arr = [12, 11, 13, 5, 6, 7] heapSort(arr) print("排序后的数组:") for i in range(len(arr)): print("%d" % arr[i]), ``` 以上代码中,`heapify`函数用于堆化,`heapSort`函数用于进行堆排序。通过调用`heapSort`函数传入待排序的数组,即可以实现堆排序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值