行者

慢慢走,不要停
随笔 - 15, 文章 - 0, 评论 - 0, 阅读 - 3343
  博客园  :: 新随笔  :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

堆排序

Posted on   angury  阅读(1)  评论(0编辑  收藏  举报
复制代码
#include<stdio.h>
void swap(int A[],int i,int j)
{

    int tmp=A[i];
    A[i]=A[j];
    A[j]=tmp;
}
void heapify(int A[],int N,int i)
{
/*可有可无
if(i>=N) { return; }
*/
int c1=2*i+1; int c2=2*i+2; int max=i; if(c1<N&&A[c1]>A[max]) { max=c1; } if(c2<N&&A[c2]>A[max]) { max=c2; } if(max!=i)/*错误写为while···*/ { swap(A,i,max); heapify(A,N,max); /* 对一个节点做heapify的时候,必须保证它的所有子树都已经是堆。 所以,在这个前提下,如果要做heapify的节点已经符合“父节点 > 子节点”的性质,那么这就已经是一个堆了;就没有必要往下走了。 另外,我们的build_heap函数是从最后一个不是叶节点的点开始往前做heapify操作的,所以最后是可以形成一个堆。 如果max不等于i说明需要将节点i和子节点max交换,交换后,递归调用heapify max节点保证以max为根的子树也构成堆结构。 因为heapify是在build_heap里调用的,而build_heap是从最后一个父节点往树上面调用,
在中间某层如果i和max换了,可能会破max为根的坏子树的堆结构,才需要递归保证以max为根的子树为堆,否则并不需要,因为是从下往上建堆,子树一定是堆结构。
*/ } } void build_heap(int A[],int N) { int last_node=N-1; int parent=(last_node-1)/2; int i; for(i=parent;i>=0;i--) { heapify(A,N,i); /*粗心错误:将i写成parent*/ } } void heap_sort(int A[],int N) { build_heap(A,N); int i; for(i=N-1;i>=0;i--) { swap(A,i,0);/*粗心错误:swap(A,A[i],0)*/ heapify(A,i,0);/*heapify即可,不必新建堆*//*(A,N,0)错误,i之后的已经排好序了*/ } } int main() { int A[10]={1,6,7,5,2,3,4,9,0,63}; int N=10; heap_sort(A,N); int i; for(i=0;i<N;i++) { printf("%d ",A[i]); } return 0; }
复制代码

 

编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略
点击右上角即可分享
微信分享提示