堆排序

来源:互联网 发布:python 词语相似度 编辑:程序博客网 时间:2024/05/16 07:45
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
class Heap
{
public:
    Heap<T>(const vector<T>& a)
    {
        m.assign(a.begin(),a.end());
        //printArray(m);
    }
    template <typename Compare>
    //comp 为less<Type> 则大数下沉,创建最小堆,从小到大排序
    //comp 为greater<Type> 则小数下沉,创建最大堆,从大到小排序
    void sort(Compare comp);
    void printArray(const vector<T>& a);
private:
    vector<T> m;
    template <typename Compare>
    void creatHeap(Compare comp);//创建堆
    template <typename Compare>
    void downElement(int i,Compare comp);//下沉元素
};
template <typename T>
template <typename Compare>
void Heap<T>::sort(Compare comp)
{
    printArray(m);
    creatHeap(comp);
    vector<T> array;
    for(int i = m.size()-1;i >= 0;i--)
    {
        array.push_back(m[0]);
        swap(m[0],m[i]);
        m.pop_back();
        downElement(0,comp);
    }
    printArray(array);
    m.assign(array.begin(),array.end());
}
template <typename T>
void Heap<T>::printArray(const vector<T>& a)
{
    for(int i = 0;i < a.size();i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}
template <typename T>
template <typename Compare>
void Heap<T>::creatHeap(Compare comp)
{
    //从最后一个非叶子节点开始,将每个父节点都调整为最小堆
    for(int i = m.size()/2 - 1;i >= 0;i--)
    {
        downElement(i,comp);
    }
}
template <typename T>
template <typename Compare>
void Heap<T>::downElement(int i,Compare comp)
{
    int down = i;
    int min;
    while((2*down+1) < m.size())
    {
        min = 2*down+1;
        if((2*down+2) < m.size())
        {
            if(comp(m[2*down+2],m[min]))
                min = 2*down+2;
        }
        if(comp(m[down],m[min]))
        {
            break;
        }
        else
        {
            swap(m[min],m[down]);
            down = min;
        }
    }
}
int main()
{
    vector<int> a;
    for(int i = 10;i < 20;i++)
    {
        a.push_back(i);
    }
    random_shuffle(a.begin(),a.end());
    Heap<int> heap(a);
    heap.sort(less<int>());
    heap.sort(greater<int>());
    return 0;
}
0 0
原创粉丝点击