您的位置:首页 > 编程语言 > C语言/C++

算法导论 堆排序 C语言实现

2014-06-02 20:51 381 查看
算法导论 第六章 堆排序c语言

按照书上的顺序来

i是下标,由于C语言里下标从0开始与书上有些不同,这样就可以算出下标为I的元素的父元素和左右子元素的下标
<span style="font-size:14px;">int PARENT (int i)
{
return (i-1)/2;
}
int LEFT (int i)
{
    return ((i+1)<<1)-1;
}
int RIGHT (int i)
{
    return (i+1)<<1;
<span style="font-family:Microsoft YaHei;font-size:18px;">}</span></span><span style="font-family:Microsoft YaHei;font-size:18px;">
</span>
下面是维护最大堆性质的函数 ,I 是下标
</pre><pre name="code" class="cpp"><span style="font-size:18px;">void MAX_HEAPIFY (int A[],int i,int length)
{
int r,l,largest;
r=RIGHT(i);
l=LEFR(i);
if(r < length && A[r]>A[i])
largest=r;
else
largest=i;
if(l < length && A[l]>A[largest])
largest=l;                                //找个三个元素中值最大元素的下标
if(largest != i)
{
swap(&A[i],&A[largest]);                   //把大的换到上面去,并且因为交换了元素,下面的元素可能不满足最大堆,所以要对largest元素递归要用
MAX_HEAPIFY(A,largest,length);
}
}</span>
建堆,就是对所有有子节点的元素分别调用 MAX_HEAPIFY

有子节点的元素是 (length/2)-1 to 0
</pre><pre name="code" class="html"><span style="font-size:18px;">void BUILD-MAX-HEAP(int A[],int length)
{
int i;
for(i = (length/2)-1 ;i >= 0; i--)
MAX_HEAPIFY(A,i,length);
}</span>
最后就是排序了,调用BUILD-MAX-HEAP建造最大堆,所以只要把堆最上面的元素拿出来就OK;
<span style="font-size:18px;">void HEAPSORT (int A[],int length)
{
BUILD-MAX_HEAP(A,length);
int i;
for(i=length-1;i>=1;i--)
{
swap(&A[0],&A[i]);
MAX_HEAPIFY(A,0,i-1);
}
}</span>


有点不懂书里面的heap-size是干什么
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: