码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2020-01-07 01:02:59      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:数组   class   通过   else   heap   int   条件   size   wap   

①维护堆的性质,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);
	}
}

  

堆排序

标签:数组   class   通过   else   heap   int   条件   size   wap   

原文地址:https://www.cnblogs.com/KIROsola/p/12159084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!