算法导论 堆排序 C语言实现
2014-06-02 20:51
381 查看
算法导论 第六章 堆排序c语言
按照书上的顺序来
i是下标,由于C语言里下标从0开始与书上有些不同,这样就可以算出下标为I的元素的父元素和左右子元素的下标
有子节点的元素是 (length/2)-1 to 0
有点不懂书里面的heap-size是干什么
按照书上的顺序来
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是干什么
相关文章推荐
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 【算法导论】堆排序实现
- 用c语言实现红黑树(依据算法导论上的方法)
- c++堆排序实现(heapsort) (算法导论)
- 【算法导论】归并排序,C语言实现
- 算法导论——关于快速排序的实现(c语言实现)
- 归并排序的C语言实现【严蔚敏+算法导论】
- 【算法导论】c++实现堆排序
- C语言对堆排序一个算法思路和实现代码
- [算法练习]堆排序的C语言实现
- 算法导论之最大子数组问题 C语言实现
- 堆排序(算法导论实现)
- 【算法】C语言实现堆排序
- 数组实现堆排序(来源算法导论)
- 算法导论 习题6.2-5 用迭代法实现堆排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 10个重要的算法C语言实现源代码(其2--牛顿插值)
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 数值计算方法与算法:C语言实现利用Gauss消元法解方程组
- 10个重要的算法C语言实现源代码(其4和5---龙贝格和牛顿迭代)