定义

  • 堆是一棵完全二叉树
  • 树中每个结点的值均不大于(或不小于)左右孩子结点的值
  • 一般使用优先队列实现

向下调整

  • 因为向下调整默认调整的节点后面的都是排好序的,所以在使用向下调整时,都是从后往前
//向下调整:把欲调整结点与子节点比较
void downAdjust(int low,int high)
{
	int i = low, j = 2 * i;//j是左孩子结点
	while (j <= high)//i存在孩子
	{
		if (j + 1 <= high && heap[j + 1] > heap[j])
		{
			j = j + 1;
		}
		if (heap[j] > heap[i])
		{
			int temp = heap[j];
			heap[j] = heap[i];
			heap[i] = temp;
			i = j;
			j = 2 * i;
		}
		else
		{
			break;
		}
		
	}

}

建堆

//建堆
void createHeap()
{
	for (int i = n / 2; i >= 1; i--)
	{
		downAdjust(i, n);
	}
}

删除栈顶

//删除栈顶 把最后一个元素放在栈顶 然后向下调整
void deleteTop()
{
	heap[1] = heap[n--];
	downAdjust(1, n);
}

向上调整

//向上调整 把当前节点与父亲节点作比较
void upAdjust(int low,int high)
{
	int i = high, j = i / 2;
	while (j >= low)
	{
		if (heap[i] <= heap[j])
		{
			//交换
			int temp = heap[i];
			heap[i] = heap[j];
			heap[j] = temp;
			i = j;
			j = i / 2;
		}
		else
		{
			break;
		}
	}
}

添加元素

//添加元素:添加到末尾后,进行调整
void insert(int v)
{
	heap[++n] = v;
	upAdjust(1, n);
}

堆排序

//堆排序 取出每次最值(栈顶)放在最后,将未排序的元素的末尾放在栈顶,进行向下调整
void heapSort()
{
	createHeap();
	for (int i = n; i >1; i++)
	{
		int temp = heap[1];
		heap[1] = heap[i];
		heap[i] = temp;
		downAdjust(1, i-1);
	}
}
posted @ 2021-09-05 10:04  小帆敲代码  阅读(29)  评论(0编辑  收藏  举报