排序算法——堆排序

#include <stdio.h>
#define N 10

// 二叉堆中的元素个数为N,那么其中最后一个非叶节点为A[N/2 - 1],调整的时候需要从最后一个非叶节点开始交换
int A[N] = {9,8,7,6,5,4,3,2,1,0};

void Swap(int *X, int *Y)
{
	int Tmp;
	Tmp = *X;
	*X = *Y;
	*Y = Tmp;
}

void Print()
{
	printf("Swap: ");
	for(int i = 0; i < N; i++)
	{
		printf("%d ", A[i]);
	}
	printf("\n");
}

// 递归调整顺序
void HeapAdjust(int M, int T)
{
	int LeftChild = 2 * M + 1;
	int RightChild = 2 * M + 2;
	if(LeftChild < T && A[M] < A[LeftChild])
	{
		Swap(&A[M], &A[LeftChild]);
		Print();
	}
	if(RightChild < T && A[M] < A[RightChild])
	{
		Swap(&A[M], &A[RightChild]);
		Print();
	}
	if(LeftChild < T)
		HeapAdjust(LeftChild, T);
	if(RightChild < T)
		HeapAdjust(RightChild, T);
	//Print();
}

void BuildHeap()
{
	for(int Mid = N / 2 - 1; Mid >= 0; Mid--)
	{
		HeapAdjust(Mid, N);
	}
	printf("BuildHeapFinished\n");
}

void HeapSort()
{
	// 首先对初始堆排好序
	BuildHeap();
	
	// 然后根据剩余元素个数来循环,每次循环会删掉一个最大值,这个最大值通过与堆顶元素交换而来。
	// 当只剩余一个元素循环停止,该元素就是最小的值
	for(int i = N - 1; i >= 1; i--)
	{	
		printf("---------------------\n");	// 交换第一个和最后一个
		Swap(&A[0], &A[i]);
		Print();
		HeapAdjust(0, i);
	}
}

int main()
{
	Print();
	HeapSort();
	Print();

	return 0;
}

最近复习《数据结构与算法分析》,发现教材上写的代码不完整,因此自己练习了一下。

参考http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值