系列综述:
💞目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇
// 插入底部,插入结点自底向上上浮
void HeapUp(vector<int> &vec, int index) {
// 若当前结点大于父亲结点,则交换
while (vec[index] > vec[(index - 1) / 2]) {
swap(vec[index], vec[(index - 1) / 2]);
index = (index-1) / 2;
}
}
// 弹出根节点,插入结点自顶向下下沉
void HeapDown(vector<int> &vec, int index, int heap_size) {
int left = index * 2 + 1;
while (left < heap_size) { // 表示孩子,即至少有一个左孩子
// 有右孩子 && 右孩子值大于左孩子 则最大下标为右孩子,否则是左孩子
int largest = left + 1 < heap_size && vec[left+1] > vec[left] ? left+1 : left;
// largest中存储自己和左右孩子中最大的
largest = vec[largest] > vec[index] ? largest : index;
if (largest == index) break; // 如果是根结点则停止
swap(vec[largest], vec[index]);
// 迭代条件
index = largest;
left = index * 2 + 1;
}
}
// 堆排序
void HeapSort(vector<int> vec) {
if (vec.empty() || vec.size() < 2) return ;
// 依次将每个数插入,建立大根堆
for (int i = 0; i < vec.size(); ++i) {
HeapUp(vec, i);
}
// 每次将大根堆的堆顶元素与数组尾元素交换
int heap_size = vec.size();
swap(vec[0], vec[--heap_size]);
while (heap_size > 0) {
HeapDown(vec[0], vec[head_size]);
swap(vec[0], vec[--heap_size]);
}
}
在这里插入代码片