【C++单排之路】基本排序算法--堆排序

本文详细介绍了堆排序算法,包括构建最大堆的过程、堆排序的具体步骤,并提供了完整的C++实现代码。通过实例演示了如何利用堆排序对数组进行升序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.堆排序

1.1 构建最大堆


1.2 堆排序



1.3 代码及注释

//堆排序,时间复杂度为O(nlogn)
//堆排序中的堆指的是最大堆
#include<iostream>
using namespace std;
//交换
void exchange(int &a,int &b){
    int temp;
    temp = a;
    a= b;
    b= temp;
}
//调整最大堆,这个函数假定以pos位置作为根节点,其左右子数都是最大堆。仅仅只有a[pos]与其两个(或者只有左孩子)孩子a[2*pos]和a[2*pos+1]的大小关系不确定。需要以pos为根,自上而下的递归调整
void Max_Heapify(int *a,int pos,int len){  //这里的len的作用,在构建最大堆时为原数组的大小10,由于堆排序是原址排序,已排序好的放在数组最后,因此数组的待排序长度需要递减
    int l= 2*pos;
    int r= 2*pos+1;
    int largest = pos;
    if((l<=len)&&(a[l]>a[pos])){
        largest = l;
    }
    if((r<=len)&&(a[r]>a[largest])){
        largest = r;
    }
    if(largest!=pos){
        exchange(a[pos],a[largest]);
        Max_Heapify(a,largest,len);
    }
}
//建立最大堆,从第一个非叶节点开始直到根节点
void Build_Max_Heap(int *a){
    for(int i=5;i>=1;i--){
        Max_Heapify(a,i,10);
    }
}
//输出
void printHeap(int *a){
    for(int i=1;i<=10;i++){
        cout<<a[i]<<"  ";
    }
    cout<<endl;
}
//堆排序海曙,首先建立堆,每次把最大堆的根节点与待排序的最后一个元素做交换,待排序的长度递减,这样同时也会破坏最大堆,所以每次还需要从根节点开始调整最大堆
void Heap_Sort(int *a){
    Build_Max_Heap(a);//首先要建立最大堆
    exchange(a[1],a[10]);
    for(int i=9;i>1;i--){ //循环n-2次
        Max_Heapify(a,1,i);
        exchange(a[1],a[i]);
    }
    printHeap(a);
}
//主函数
int main(){
    int array[] = {0,4,1,3,2,16,9,10,14,8,7}; //待排序数组,这个数组的0号元素不存放数据,不参与排序,目的是为了满足节点与其子节点的下标对应关系
//                                              (若一个节点下标为pos,则2*pos为其左孩子,2*pos+1为它的右孩子,pos/2为它的父节点)
    Heap_Sort(array);
    system("pause");
    return 0;
}

1.4 结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值