您的位置:首页 > 其它

堆排序

2012-10-31 22:27 141 查看
最大堆排序算法:

View Code

#include<stdio.h>
#include<stdlib.h>

#define LEFT(i) i*2+1
#define RIGHT(i) i*2+2
#define PARENT(i) floor((i-1)/2)

typedef int DataType;
/*
局部特性:对节点i,考察它的子树,将其子树下面的最大值换到该节点上来。
*/
void max_heapify(DataType A[],int i,int length)
{
int l,r;
int large;
l = LEFT(i);
r = RIGHT(i);
if( (l < length) && (A[l] > A[i])){
large = l;
}else{
large = i;
}

if( (r < length) && (A[r] > A[large])){
large = r;
}
if(large != i){
DataType tmp;
tmp = A[i];
A[i] = A[large];
A[large] = tmp;
max_heapify(A,large,length);
}

}
/*
构建大堆结构,对于叶子节点,无需进行调整,所以只需调整中间节点。而中间节点的范围是再0-PATENT(length)直接。
*/
void build_max_heap(DataType A[],int length)
{
int i;
for(i=PARENT(length);i>=0;i--){
max_heapify(A,i,length);
}
}
/*
堆排序,由于0元素再建堆之后,肯定是最大的。所以将其摘到数组最后,将叶子调到堆中。然后对0元素做堆出来,找到最大的那个,再摘到数组中
这样循环,直到堆中的最后一个元素。这里可以看出来,其实这样做的冗余度挺大的。因为如果堆高度很高,而每一次摘除之后,找到最大的那个元素
需要做很多递归调用。因为需要改进尽快找到那个最大的元素。
*/
void heapsnort(DataType A[],int length)
{
int i;
build_max_heap(A,length);
for(i=length-1;i>0;i--){
DataType tmp;
tmp = A[0];
A[0] = A[i];
A[i] = tmp;
max_heapify(A,0,i);
}
}
int main()
{
int i;
int length;
DataType A[10]={4,1,3,2,16,9,10,14,8,7};
printf("sizeof = %d\n",sizeof(A)/sizeof(DataType));
length = sizeof(A)/sizeof(DataType);
//max_heapify(A,1,length);
//build_max_heap(A,length);
heapsnort(A,length);
for(i=0;i<10;i++){
printf("%d ",A[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: