【排序算法】-堆排序

只实现了最大堆,最小堆同理;没有设置模板接口创建最小堆,之后改进。环境:VS2010 C++ Win10 64位。

template <typename Type>
class Heap
{
public:
    void sort(vector <Type> &array);
    void buildHeap(vector <Type>&array);
    Heap() :heapSize(0){}
private:
    int heapSize;
    void keepHeap(vector <Type>& array, int element);
    int left(int element){ return element * 2+1; }
    int right(int element){ return (element+1) * 2 ; }
    void  swap(vector <Type>& array, int n1, int n2);
};
template<typename Type>
void  Heap<Type> ::keepHeap(vector <Type>& array, int element)
{//维护最大堆性质
    int l = left(element), r = right(element);
    int largest = 0;
    if (l < heapSize && array.at(l) > array.at(element))
        largest = l;
    else
        largest = element;
    if (r < heapSize && array.at(r) > array.at(largest))
        largest = r;

    if (largest != element)
    {
        swap(array, element, largest);
        keepHeap(array, largest);
    }
}

template<typename Type>
void Heap<Type>::buildHeap(vector <Type>&array)
{
    heapSize = array.size();
    for (int i = array.size() / 2-1 ; i >= 0 ; --i)
    {
        keepHeap(array, i);
    }
}
template<typename Type>
void Heap<Type> ::sort(vector <Type>&array)
{
    buildHeap(array);
    for (int i = array.size() - 1; i >0; --i)
    {
        swap(array, 0, i);
        heapSize--;
        keepHeap(array, 0);
    }
}
template<typename Type>
void Heap<Type>::swap(vector <Type>& array, int n1, int n2)
{
    Type tmp = array[n1];
    array[n1] = array[n2];
    array[n2] = tmp;
}

算法特点归纳总结:
算法实现较为复杂,维护堆性质部分,使用了递归的算法,程序开销较大。算法平均复杂度和最坏情况为 Onlog(n) ,最好情况为 On ,属于In-place 操作。空间开销不大。算法稳定。但是由于维护堆函数复杂,实际使用中时间开销并不理想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值