堆排序
概念:使已有的堆进行排序,使得从0号下标位置到最后一个位置,元素一次增大或者依次减小
堆降序,则要建立一个小堆
堆升序,则需建立一个大堆
步骤:
- 建立一个堆(大堆或者小堆,这里建立一个小堆)
- 让对顶元素与最后一个元素进行比较,如果大于堆顶元素,交换
- 有效元素减1,对变化后的树进行调整为堆
- 重复步骤2,知道只剩下一个元素
- 恢复原来的有效元素个数
代码展示
使用到堆的基本操作
本程序使用到,堆的创建,向下调整函数,交换函数,比较函数等
void _HeapSort(Heap * hp)
{
//将有效元素的两个数保存,之后需要改变
int size = hp->_size;
assert(hp);
while(hp->_size > 1) //如果有效元素的个数大于1,进入循环,只有一个的话不需要交换
{
//如果建立的小堆的堆顶元素,小于最后一个有效元素,交换
if(hp->com(hp->_array[0],hp->_array[hp->_size-1]))
{
swap(&hp->_array[0],&hp->_array[hp->_size-1]);
}
//交换完后将有效元素个数减1,这就排好了一个元素,将最小的元素放到了最后
hp->_size -= 1;
//堆交换后的树进行向下调整为小堆
AdjustDown(hp,0);
}
//恢复有效元素个数,
hp->_size = size;
}
//测试test
void HeapSortTest()
{
Heap hp;
DataType array[] = {53,17,78,9,45,65,87,23,31};
//创建小堆Less表示小堆
CreateHeap(&hp,array,sizeof(array)/sizeof(array[0]),Less);
//进行降序堆排序
_HeapSort(&hp);
//打印堆中元素
printHeap(hp);
}