堆排序heap_sort
#include <iostream>
void adjust_heap(int *begin, int *end, int index)
{
int temp = *(begin + index);
int child = (index << 1) + 1;
while(child <= end - begin)
{
if(child < end - begin && *(begin + child) < *(begin + child +1))
child ++;
if(temp < *(begin + child))
{
*(begin + index) = *(begin + child);
index = child;
child = (child << 1) + 1;
}
else
break;
}
*(begin + index) = temp;
}
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void heap_sort(int *begin, int *end)
{
int index = (end - begin - 1) / 2;
//根据完全二叉树,须从倒数第一个非叶子结点开始调整堆, index即为倒数第一个非叶子结点的索引号
while(index >= 0)
{
adjust_heap(begin, end, index);
index --;
}
while(begin < end)
{
swap(&*begin, &*end);//将首指针存的最大值或最小值与尾指针元素互换
end --;//末指针前移,因为此时end已经存最大数或最小数
adjust_heap(begin, end, 0);//重新调整为堆,此时只需从首指针元素开始即可,\
//因为以首指针元素为根的子树已经是堆
}
}
int main()
{
int data[] = {1, 0, 5, 2, 6, 3};
heap_sort(data + 0, data + 5);
for(int i = 0; i <= 5; i ++)
{
std::cout << *(data + i) << " ";
}
std::cout << std::endl;
return 0;
}