堆排序实现

6 篇文章 0 订阅
4 篇文章 0 订阅

Heapify
基本思想:将一个完全二叉树所有的叶子节点先分别都视为一个最大堆,然后对第一个非叶子结点进行shiftDown操作,使得该节点和它的叶子节点构成一个最大堆。依次对第二、三个非叶子节点进行同样的操作,直到整个堆变成一个最大堆。

对于一个完全二叉树,第一个非叶子节点的索引是完全二叉树的元素个数除2得到的值。

具体实现:
添加新的公有构造函数

MaxHeap(Item arr[], int n){
        data = new Item[n+1];
        capacity = n;

        for( int i = 0 ; i < n ; i ++ )
            data[i+1] = arr[i];
        count = n;

        for( int i = count/2 ; i >= 1 ; i -- )
            shiftDown(i);
    }

第二种堆排序:

template<typename T>
void heapSort2(T arr[],int n){
    MaxHeap<T>maxheap=MaxHeap<T>(arr,n);
    //倒序赋值
    for(int i=n-1;i>=0;i--)
        arr[i]=maxheap.extractMax();
}

注:
将n个元素逐个插入到一个空堆中,算法复杂度是O(nlogn)
heapify的过程,算法复杂度是O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值