ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

堆排序

2022-06-08 20:36:38  阅读:85  来源: 互联网

标签:BuildMaxHeap int void 元素 堆排序 len Headjust


#include<stdc++.h>
using namespace std;

void BuildMaxHeap(int a[],int len);
void Headjust(int a[],int k,int len);
void HeapSort(int a[],int len);

//从最大序号的非终端结点开始自下至上进行调整,建堆
void BuildMaxHeap(int a[],int len){
    for(int i=len/2;i>0;i--)
        Headjust(a,i,len);
}

//调整以k为根的子树
void Headjust(int a[],int k,int len){
    a[0]=a[k];
    for(int i=2*k;i<=len;i*=2){
        if(i<len && a[i]<a[i+1])
            i++;
        if(a[0]>=a[i]) break;
        else{
            a[k]=a[i];   //这里不是交换,大元素上移,小元素待定放在a[0],减少交换次数
            k=i;
        }
    }
    a[k]=a[0];  //将小元素下坠到指定位置
}

//堆排序
void HeapSort(int a[],int len){
    BuildMaxHeap(a,len);
    for(int i=len;i>1;i--){
        swap(a[1],a[i]);
        Headjust(a,1,i-1);
    }
}
int main()
{
    int a[]={0,1,13,2,44,93}; //a[0] 仅作辅助空间,不是堆元素
    
    //验证将一个顺序存储的完全二叉树转换成大根堆
    Headjust(a,1,5);    
    for(int i=1;i<=5;i++)
        cout<<a[i]<<" ";
    puts("");

    //验证堆排序
    HeapSort(a,5);  
    for(int i=1;i<=5;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

标签:BuildMaxHeap,int,void,元素,堆排序,len,Headjust
来源: https://www.cnblogs.com/rabbithacker/p/16357084.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有