排序算法——堆排序
2023-09-11 14:22:29 时间
前言
对于推排序它像合并排序而不像插入排序,堆排序的运行时间为O(nlogn)。像插入排序而不像合并排序,它是一种原地排序算法:在任何时候,数组中只有常数和元素存储在输入数组以外。这样堆排序就拥有了两种排序算法的优点。
堆算法中涉及到的主要算法有:维持最大堆(Max_Heapify)和建立堆(Build_Max_Heap)。
1. 编码实现
这里为了使得数组的下标是从1开始计算的,在数组的首部插入了元素-1 。
1.1 维护最大堆
//维持堆性质
int heap_size = 0; //堆中元素
void Max_Heapify(std::vector<int>& vec, int pos) //pos为当前操作的根位置
{
int left(pos*2);
int right(pos*2+1);
//求出最大的根节点
int root_pos(-1);
if(left<=heap_size && vec[pos]<vec[left])
{
root_pos = left;
}
else
{
root_pos = pos;
}
if(right<=heap_size && vec[root_pos]<vec[right])
{
root_pos = right;
}
//不满足最大堆的性质了,因为比较之后求出来的根节点和输入的节点不一样
if(root_pos != pos)
{
std::swap(vec[root_pos], vec[pos]);
Max_Heapify(vec, root_pos);
}
}
1.2 创建最大堆
//创建堆
void Build_Max_Heap(std::vector<int>& vec)
{
//由于堆中有heap_size/2~heap_size 的元素为叶子节点,因而只需要迭代heap_size/2次
for(int i=(heap_size/2); i>=1; --i)
{
Max_Heapify(vec, i);
}
}
1.3 堆排序
//堆算法
void HeapSort(std::vector<int>& vec)
{
int len(vec.size());
if(len == 0) return;
cout << "display origin array:" << endl;
for_each(vec.begin(), vec.end(), Disp<int>()); //打印原始的数据
std::vector<int> temp = vec;
heap_size = vec.size();
temp.insert(temp.begin(), -1);
Build_Max_Heap(temp);
int loop = heap_size;
for(int i=heap_size; i>=1; --i)
{
vec[i-1] = temp[1];
std::swap(temp[1], temp[i]);
temp.pop_back();
--heap_size;
Max_Heapify(temp, 1);
}
cout << "\narray sorted:" << endl;
for_each(vec.begin(), vec.end(), Disp<int>());
}
相关文章
- 【数字图像处理】边界跟踪算法
- 堆排序算法---属于选择排序
- Java实现 蓝桥杯VIP 算法提高 淘淘的名单
- Java实现 蓝桥杯VIP 算法提高 多项式输出
- Java实现 蓝桥杯VIP 算法提高 选择排序
- Java实现 蓝桥杯VIP 算法训练 快速排序
- Java实现 蓝桥杯 算法训练 寻找数组中最大值
- 排序算法
- 用Java来写常见的排序算法
- 【刷题】【LeetCode】000-十大经典排序算法
- 七种经典排序算法及Java实现
- C++11时代的标准库快餐教程(4) - 排序算法的应用
- 排序算法
- Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics)1 2. 第六章 堆排序(Heapsort)
- 【堆排序】十大排序算法之堆排序
- 【优化模型】逐步回归算法
- 经典算法学习——直接选择排序
- 【数据结构与算法Python实践系列】5分钟学会经典排序算法-快速排序
- 白话经典算法系列之六 高速排序 高速搞定
- 白话经典算法系列之六 高速排序 高速搞定
- 排序算法视频 《6 分钟演示 15 种排序算法》
- 白话经典算法系列之六 快速排序 快速搞定
- 图解排序算法(三)之堆排序
- 【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)
- Opencv相机标定角点提取算法之角点排序
- Pytorch总结十六之优化算法:图像增广训练模型、微调(迁移学习)实现热狗识别