堆排序

Posted kirosola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

①维护堆的性质,max_heapify通过让A[i]的值在最大堆中“逐级下降”,从而使得下标i为根节点的子树重新遵循最大堆性质。

void max_heapify(int A[], int i)
{
	int left = 2 * i;
	int right = 2 * i + 1;
	int largest;
	bool flag = false;

	flag = false;
	if (left <= heap_size && A[left] > A[i])
		largest = left;
	else
		largest = i;
	if (right <= heap_size && A[right] > A[largest])
		largest = right;
	if (largest != i)
	{
		swap(A[i], A[largest]);
		flag = true;
	}
	
	if(flag)
		max_heapify(A, largest);
}

  注意:flag是判断是否递归的条件,当不须交换时,证明维护完毕。

②建堆:自底向上方法利用max_heapity把数组转换成最大堆。

void build_max_heap(int A[])
{
	int i;
	for (i = heap_size / 2; i >= 1; i--)
	{
		max_heapify(A, i);
	}
}

③堆排序算法:数组中最大元素总在根结点A[1]中,每次将A[1]与A[n]互换,再维护A[1~n-1]最大堆的性质。

void heap_sort(int A[])
{
	int i;
	build_max_heap(A);
	for (i = heap_size; i >= 2; i--)
	{
		swap(A[1], A[i]);
		heap_size = heap_size - 1;
		max_heapify(A, 1);
	}
}

  

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序