建立堆,添加元素,删除最大元素,排序,C++

堆相关

void heapAdjust(vector<int> &arrs, int i, int len)
{
    int left=i*2+1, right=i*2+2;
    int maxidx = i;
    if(left<len && arrs[left]>arrs[maxidx]){
        maxidx = left;
    }
    if(right<len && arrs[right]>arrs[maxidx]){
        maxidx = right;
    }
    if(maxidx==i) return;
    swap(arrs[maxidx], arrs[i]);
    heapAdjust(arrs, maxidx, len);
}

void print(vector<int> &arrs)
{
    for(int num:arrs){
        cout<<num<<" ";
    }
    cout<<endl;
}

int main(int argc, char** argv)
{
    vector<int> arrs;
    for(int i=0; i<10; i++){
        arrs.push_back(rand()%100);
    }
    cout<<"init array: ";
    print(arrs);
    int len = arrs.size();
    // buildMaxHeap
    for(int i=len/2; i>=0; i--){
        heapAdjust(arrs, i, len);
    }
    cout<<"init heap: ";
    print(arrs);
    // add
    arrs.push_back(rand()%100);
    len = arrs.size();
    int aidx = len-1, par=(len-2)/2;
    while (arrs[aidx]>arrs[par]){
        swap(arrs[aidx], arrs[par]);
        aidx = par;
        par=(aidx-1)/2;
    }
    cout<<"add elements to heap: ";
    print(arrs);
    // del
    len = len-1;
    swap(arrs[0], arrs[len]);
    arrs.pop_back();
    heapAdjust(arrs, 0, len);
    cout<<"del max heap: ";
    print(arrs);

    // sort
    for(int i=len-1; i>=0; i--){
        swap(arrs[0], arrs[i]);
        heapAdjust(arrs, 0, i);
    }
    cout<<"sort heap: ";
    print(arrs);
    return 0;
}

时间复杂度分析

堆建立: n / 2 n/2 n/2次调用 heapAdjust ,平均每次递归 l o g n logn logn次,所以时间复杂度为 n l o g n nlogn nlogn
添加:只需与父节点交换数据,最多 l o g n logn logn次,所以时间复杂度为 l o g n logn logn
删除最大元素:根节点与末尾元素交换,删除末尾元素,从根节点开始调整,最多 l o g n logn logn次,所以时间复杂度为 l o g n logn logn
堆排序:每次根节点与末尾元素交换,然后从跟节点调整,堆元素数量减1,一直调整到第一个元素,调整时间复杂度为 l o g n logn logn n n n次调整,所以时间复杂度为 n l o g n nlogn nlogn

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值