你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
C++ 堆排序实现
 
print?void HeapAdjust(int a[],int s,int n)//construct heap  

    int j,t; 
    while(2*s+1<n)//是否存在左子树  
    { 
        j=2*s+1; 
        if((j+1)<n) 
        { 
            if(a[j]<a[j+1])//左子树小于右子树,则需要比较右子树  
                j++;//序号增加1,指向右子树  
        } 
        if(a[s]<a[j])//比较s与j为序号的数据  
        { 
            t=a[s]; 
            a[s]=a[j]; 
            a[j]=t; 
            s=j;//交换后该节点的子节点的堆结构被破坏,需要向下重新调整成堆  
        } 
        else//比较左右孩子均大则堆未被破坏,不需要再调整  
            break; 
    } 

void HeapSort(int a[],int n)//堆排序  

    int t,i; 
    int j; 
    //建堆过程  
    for(i=n/2-1;i>=0;i--)//将a[0,n-1]建成大根堆,建堆时从第一个非叶子节点开始判断是否满足堆结构,然后进行调整  
        HeapAdjust(a,i,n); 
    //将调整好的堆的堆顶元素输出(与末尾元素交换),从根节点开始重新调整整个堆  
    //重复进行n-1次  
    for(i=n-1;i>0;i--) 
    { 
        t=a[0];//与第i个记录交换(i后面的记录已经有序),将堆顶的记录输出  
        a[0]=a[i]; 
        a[i]=t; 
        HeapAdjust(a,0,i);//将a[0]至a[i]重新调整为堆,调整堆时由于之前已经满足堆结构,只有堆顶被破坏,所以从堆顶开始向下调整  
    } 

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089