堆排序

堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

1.排序原理

在堆的数据结构中,堆中的最大值总是位于根节点
其中堆定义了以下几种操作:
(一)最大堆调整(Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
(二)创建最大堆(CreateHeap):将堆中的所有数据重新排序
(三)堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

<mark>操作过程图示</mark>

一、最大堆调整(Heapify):

二、创建最大堆(CreateHeap):

三、堆排序(HeapSort):

2.源代码:

#include<stdio.h>
#define N 10
void swap(int num[],int i,int j)//交换结点
{
	int temp;
	temp=num[i];
	num[i]=num[j];
	num[j]=temp;
}
void Heapify(int num[],int len,int k)//最大堆调整
{
	if(k<len)
	{
		int max=k;//根结点
		int s1=2*k+1;//左子节点
		int s2=2*k+2;//右子结点
		//找出最大结点
		if(num[s1]>num[max]&&s1<len)
			max=s1;
		if(num[s2]>num[max]&&s2<len)
			max=s2;
		//交换最大子节点到根结点并做递归
		if(max!=k)
		{
			swap(num,max,k);
			Heapify(num,len,max);
		}
	}
}
void CreateHeap(int num[],int len)//创建最大堆
{
	int last=len-1;				//最后一个子结点位置
	int parent=(last-1)/2;		//最后一个子结点的父结点
	for(int i=parent;i>=0;i--)	
	{
		Heapify(num,len,i);		//从最后一个父结点开始做最大堆调整
	}
}
void HeapSort(int num[],int len)//堆排序
{

	CreateHeap(num,len);		//创建最大堆

	for(int i=len-1;i>=0;i--)	//依次将最大堆的根结点(最大值)取出
	{
		//将最大堆的根(最大值)换到最后
		swap(num,i,0);			
		//除去最大值,对交换后的二叉树做最大堆调整,使二叉树根结点始终为最大值 
		Heapify(num,i,0);		
	}
}
int main()
{
	int num[N]={6,5,8,4,1,3,9,7,2,0};
	HeapSort(num,N);
	for(int i=0;i<N;i++)
		printf("%d ",num[i]);
	printf("\n");
	return 0;
}