原理详见:海子博客
虽然也学过数据结构,时间长了就有些忘了,本以为堆排序还要构建二叉树,但是实际上不是这样的。数据结构仅仅是为了数据处理方便而设计的,你也可以把一个静态链表看成其它可能的结构。下面是堆排序的code。
堆排序是一种不稳定的排序方法,其平均时间复杂度为O(N*logN),最坏时间复杂度为O(N*logN)
/*
heap sort algorithm
*/
#include <stdio.h>
#include <stdlib.h>
#define A 10
int s[A+1]={0,5,40,3,20,1,-32,56,27,-90,62};
void HeapAdjust(int s[],int index,int size) //d堆调整,确保s[index]节点变化之后,原序列仍为堆
{
int lch=2*index; //左孩子
int rch=2*index+1; //有右孩子
int max=index;
int temp;
//大顶堆调整
if(lch<=size && s[lch]>s[max])
{
max=lch;
}
if(rch<=size && s[rch]>s[max])
{
max=rch;
}
if(max!=index)
{
temp=s[max];
s[max]=s[index];
s[index]=temp;
HeapAdjust(s,max,size); //孩子节点变化后,引起的新变化
}
return;
}
void BuidHeap(int s[],int n) //构建堆
{
int i;
for(i=n/2;i>=1;i--) //完全二叉树的非叶子节点的数目是n/2
{
HeapAdjust(s,i,n);
}
return;
}
void HeapSort(int s[],int n) //堆排序
{
int i,temp;
BuidHeap(s,n);
for(i=n;i>=1;i--) //堆顶节点与最后的一个叶子节点交换
{
temp=s[1];
s[1]=s[i];
s[i]=temp;
HeapAdjust(s,1,i-1); //对新堆(相对于原堆,堆顶与堆的大小发生变化)进行堆调整
}
return;
}
int main(void)
{
int i;
HeapSort(s,A);
printf("The heap sort result is:\n");
for(i=1;i<=A;i++)
{
printf("%d ",s[i]);
}
printf("\n");
system("pause");
return 0;
}