堆排序c++实现
//大堆比较
template<class T>
bool max_compare(T a, T b)
{
return a < b;
}
//小堆比较
template<class T>
bool min_compare(T a, T b)
{
return a > b;
}
template<class T>
void heapify(T *src, int start,int len,bool (*compare)(T ,T ))
{
int left = (start + 1)*2 - 1;
int right = left + 1;
int temp = start;
while (true)
{
if (left<len && compare(src[temp] , src[left]))
temp = left;
if (right<len && compare(src[temp] , src[right]))
temp = right;
if (start == temp)
break;
swap(src[start], src[temp]);
start = temp;
left = (start+1)*2 - 1;
right = left + 1;
}
}
template<class T>
void build_heap(T* src, int len, bool(*compare)(T, T))
{
int i;
for (i = (len/2)-1; i >= 0; i--)
heapify(src, i, len, compare);
}
template<class T>
void sort_head(T* src, int len, bool(*compare)(T, T))
{
assert(len > 0);
build_heap(src, len, compare);
while (len > 0)
{
swap(src[0], src[--len]);
heapify(src, 0, len, compare);
}
}
void test_heap()
{
int a[] = { 5, 4, 8, 2, 1, 12 };
sort_head(a, 6, min_compare);
for (int i = 0; i < 6; i++)
cout << a[i] << ",";
cout << endl;
}