#ifndef HEAP_SORT_H
#define HEAP_SORT_H
#include<vector>
#include<memory>
///复杂度O(n)+k*O(log n)
/// 堆排序不适合链表
template<typename T>
class sort_heap
{
public:
static void sort(std::vector<T>& arr)
{
for(int i=arr.size()/2; i>=0; i--)
{
_heap_adjust(arr, i, arr.size()-1);
}
for(int i=arr.size()-1; i>0; i--)
{
int tmp=arr[i];
arr[i]=arr[0];
arr[0]=tmp;
_heap_adjust(arr,0,i-1);
}
}
private:
static void _heap_adjust(std::vector<T>& arr, int start, int end)
{
int tmp=arr[start];
int child=2*start+1;
while(child <= end)
{
if(child<end && arr[child]<arr[child+1])
{
child++;
}
if(arr[child]>tmp)
{
arr[start]=arr[child];
start=child;
child=2*start+1;
}
else
{
break;
}
}
arr[start] = tmp;
}
};
#endif // HEAP_SORT_H