上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-优快云博客
本章重点
1.使用堆来完成堆排序
2.使用堆解决TopK问题
目录
2.3 C++代码(使用优先级队列 priority_queue)
一.堆排序
1.1 思路
由于堆的特殊性质,可以使用堆来堆数组进行排序,而且效率较高。
这里以排降序为例。
1.根据数组建堆
2.排序
a.将堆顶数据和最后一个数据交换,n--
b.0~n -1位置还满足向下调整算法。再次调整为堆
c.继续交换
如下图
排升序:建立大根堆
排降序:建立小根堆
1.2 代码
//降序为例
void HeapSort(int* arr, int n)
{
//1.将数组建堆,使用向下调整算法建立小根堆
for (int i = (n - 1 - 1) / 2; i >= 0; i--)
{
Adjustdown(arr, n, i);
}
//2.排序
//a.将堆顶数据和最后一个数据交换,再让n--,
//b.此时0~n-1还是可以使用调整算法调整为堆
//c.继续交换
int end = n - 1;
while (end >= 0)
{
swap(arr[0], arr[end]);
Adjustdown(arr, end, 0);
end--;
}
}
1.3 简单测试
测试主函数代码如下
int main()
{
DataType arr[] = { 1,5,9,7,5