排序算法---堆排序

1.简介

建立一个最大堆(线性时间)

执行N-1次下滤操作,每次下滤将堆的最后一个元素同第一个元素进行交换。

时间复杂度为:O(NlogN)

2.实现

#define  LeftChild(i) (2*(i)+1)

void PercDown(ElementType A[], int i, int N)
{
	int Child;
	ElementType Tmp;

	for (Tmp = A[i]; LeftChild(i) < N;i = Child)
	{
		Child = LeftChild(i);
		if (Child != N-1 && A[Child +1] > A[Child])
		{
			Child++;
		}
		if (Tmp < A[Child])
		{
			A[i] = A[Child];
		}
		else
			break;
	}
	A[i] = Tmp;
}
void Swap(ElementType *a, ElementType *b)
{
	ElementType tmp = *a;
	*a = *b;
	*b = tmp;
}
void Heapsort(ElementType A[], int N)
{
	int i;

	for (i = N / 2; i >= 0; i--)
	{
		PercDown(A, i, N);
	}

	for (i = N - 1; i > 0; i--)
	{
		Swap(&A[0], &A[i]);
		PercDown(A, 0, i);
	}
}

  

posted @ 2016-10-19 16:49  mCat  Views(227)  Comments(0Edit  收藏  举报