您的位置:首页 > 其它

算法导论之堆排序

2012-04-15 20:41 148 查看
/*
*Author:justinzhang
*Email:uestczhangchao@gmail.com
*Discription:实现算法导论第六章的堆排序算法
*Time:2011年5月11日15:39:30
*/

#include <stdio.h>

void swap(int *x,int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}

//建立以i为根节点的大顶堆
void Max_Heapify(int A[], int i,int heapsize)
{
int l=2*i;//取i的左孩子
int r=2*i+1;//取i的右孩子
int largest;//记录根节点、左孩子、有孩子中最大一个的索引

if(l<=heapsize && A[l]>A[i])
largest = l;
else
largest = i;

if(r<=heapsize && A[r]>A[largest])
largest = r;

if(largest!= i)
{
swap(&A[i],&A[largest]);//将最大元素放到根节点上
Max_Heapify(A,largest,heapsize);//处于根为largest的堆有可能被破坏,递归进行调整
}

}

//建立初始堆
void Build_Max_Heap(int A[],int heapsize)
{
int i;
//最大的内部节点(有叶子节点的节点)为n/2
//从最大的内部节点到整棵数的根节点建立大顶堆
for(i=heapsize/2;i>=1;i--)
{
Max_Heapify(A,i,heapsize);
}

}

//堆排序算法
void HeapSort(int A[],int len)
{
int i;
Build_Max_Heap(A,len);
//不断的将堆顶元素与数组中索引为len的元素交换
for(i=len;i>=2;i--)
{
swap(&A[1],&A[len]);
len--;
Max_Heapify(A,1,len);
}
}

int main()
{
//这里数组下标从1开始,数组第一个元素没有使用
int A[] = {0,-12,5,55,5,4,3,2,1};
int i;
HeapSort(A,5);
for(i=1;i<=5;i++)
printf("%d\n",A[i]);
system("pause");
return 0;
}


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: