堆排序模板实现

#pragma once 
#include<iostream>
#include<vector>

using namespace std;

//仿函数定义。
template<class T>
struct Big
{
    bool operator()(T x, T y)
        return x > y;
};
template<class T>
struct Sma
{
    bool operator()(T x, T y)
        return x < y;
};

//建堆的向下调整过程
template<class T, template<class> class Cmp>
void AdjustDown(T* arr, size_t end, int root)
{
    if (end <= 1)
        return;
    while (root <= (end - 2) / 2)
    {
        int child = root * 2 + 1;
        //找到
        if (child + 1 < end && Cmp<T>()(arr[child] ,arr[child+1]))
        {
            child++;
        }

        Cmp<T>()(arr[root] ,arr[child]) ? swap(arr[root], arr[child]):(1);
        root = child;
    }
}

//堆排定义,template<class> class  typeName 定义类模板依赖。调用处就不用传入类型
template<class T,template<class> class Cmp = Big>
void HeapSort(T *arr,size_t size)
{
    //建堆
    int root = (size - 2) / 2;
    while (root >= 0)
    {
        AdjustDown<T,Cmp>(arr, size, root);
        root--;
    }
    //排序
    int end = size - 1;
    while (end > 0)
    {
        swap(arr[0], arr[end]);
        AdjustDown<T,Cmp>(arr, end, 0);
        end--;
    }
}

void TestHeapSort()
{
    int arr[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
    int arr1[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
    HeapSort<int, Sma>(arr, 10);
    HeapSort<int, Big>(arr1, 10);
}
原文地址:https://www.cnblogs.com/lang5230/p/5318946.html