C++面试:堆排序、归并排序、二分查找等高阶算法

目录

堆排序 (Heap Sort)

步骤:

时间复杂度:

空间复杂度:

归并排序 (Merge Sort)

步骤:

时间复杂度:

空间复杂度:

二分查找 (Binary Search)

步骤:

时间复杂度:

空间复杂度:

面试中的应用


堆排序 (Heap Sort)

堆排序是一种基于比较的排序技术,利用二叉堆的性质来进行排序。二叉堆可以是最大堆或最小堆,在最大堆中,每个父节点的值都大于或等于其子节点的值,在最小堆中则相反。

步骤:
  1. 构建堆:将输入的无序数组构建成最大堆或最小堆。
  2. 排序
    • 在最大堆中,堆顶元素(最大值)与数组最后一个元素交换,然后减小堆的大小,并对新堆进行调整,使其满足最大堆的性质。
    • 重复此过程,直到堆的大小为 1。
时间复杂度:
  • 构建堆:O(n)
  • 调整堆:O(log n)(每次排序)
  • 总体:O(n log n)
空间复杂度:
  • O(1)(原地排序)

        堆排序使用二叉堆来排序一个数组。以下是一个最大堆排序的示例:

#include <iostream>
#include <vector>void heapify(std::vector<int> &arr, int n, int i) {int largest = i; // 初始化最大为根int left = 2 * i + 1; // 左 = 2*i + 1int right = 2 * i + 2; // 右 = 2*i + 2// 如果左子节点大于根if (left < n && arr[left] > arr[largest])largest = left;// 如果右子节点大于最大至此if (right < n && arr[right] > arr[largest])largest = right;// 如果最大不是根if (largest != i) {std::swap(arr[i], arr[largest]);// 递归地定义子堆heapify(arr, n, largest);}
}// 主要的堆排序函数
void heapSort(std::vector<int> &arr) {int n = arr.size();// 构建堆(重新排列数组)for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);// 一个个从堆顶取出元素for (int i = n - 1; i > 0; i--) {// 移动当前根到结尾std::swap(arr[0], arr[i]);// 调用 max heapify 在减小的堆上heapify(arr, i, 0);}
}// 打印数组元素的函数
void printArray(std::vector<int> &arr) {for (int i : arr)std::cout << i << " ";std::cout << "\n";
}// 测试代码
int main() {std::vector<int> arr = {12, 11, 13, 5, 6, 7};heapSort(arr);std::cout << "Sorted array is \n";printArray(arr);
}

归并排序 (Merge Sort)

归并排序是一种分而治之的算法,通过递归方式将数组分成两半,分别对这两半进行排序,然后合并成一个有序数组。

步骤:
  1. 分割:将数组从中间分成两半,直到每个子数组只有一个元素或为空。
  2. 合并:逐步合并子数组,确保每次合并后都是有序的。
时间复杂度:
  • O(n log n)(在所有情况下)
空间复杂度:
  • O(n)(需要额外的空间来合并数组)

        归并排序是一种分而治之的算法,通过将数组分成两半并递归排序,然后合并结果。

#include <iostream>
#include <vector>// 合并两个子数组的函数
void merge(std::vector<int> &arr, int l, int m, int r) {int n1 = m - l + 1;int n2 = r - m;// 创建临时数组std::vector<int> L(n1), R(n2);// 复制数据到临时数组for (int i = 0; i < n1; i++)L[i] = arr[l + i];for (int j = 0; j < n2; j++)R[j] = arr[m + 1 + j];// 合并临时数组int i = 0, j = 0, k = l;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}// 复制 L[] 的剩余元素while (i < n1) {arr[k] = L[i];i++;k++;}// 复制 R[] 的剩余元素while (j < n2) {arr[k] = R[j];j++;k++;}
}// 主归并排序函数
void mergeSort(std::vector<int> &arr, int l, int r) {if (l >= r) {return; // 如果只有一个元素}int m = l + (r - l) / 2;mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r);
}// 打印数组的函数
void printArray(std::vector<int> &arr) {for (int i : arr)std::cout << i << " ";std::cout << "\n";
}// 测试代码
int main() {std::vector<int> arr = {12, 11, 13, 5, 6, 7};mergeSort(arr, 0, arr.size() - 1);std::cout << "Sorted array is \n";printArray(arr);
}

二分查找 (Binary Search)

二分查找是一种在有序数组中查找特定元素的高效算法。它通过比较数组的中间元素与目标值,来减少搜索范围的一半。

步骤:
  1. 初始设置:设置两个指针,一个指向数组的起始位置,另一个指向数组的结束位置。
  2. 循环搜索:在指针指向的范围内,找到中间元素,并与目标值比较:
    • 如果中间元素等于目标值,则找到目标,返回其索引。
    • 如果中间元素大于目标值,则调整结束指针到中间指针之前。
    • 如果中间元素小于目标值,则调整起始指针到中间指针之后。
  3. 重复:重复步骤 2,直到找到目标或指针重合。
时间复杂度:
  • O(log n)
空间复杂度:
  • O(1)

        二分查找是在已排序数组中查找特定元素的高效方法。

#include <iostream>
#include <vector>// 二分查找函数
int binarySearch(const std::vector<int> &arr, int x) {int l = 0, r = arr.size() - 1;while (l <= r) {int m = l + (r - l) / 2;// 检查元素是否在中间if (arr[m] == x)return m;// 如果元素大于中间,它只可能在右子数组if (arr[m] < x)l = m + 1;// 否则,元素只可能在左子数组elser = m - 1;}// 如果元素不在数组中return -1;
}// 测试代码
int main() {std::vector<int> arr = {2, 3, 4, 10, 40};int x = 10;int result = binarySearch(arr, x);if (result == -1)std::cout << "Element is not present in array";elsestd::cout << "Element is present at index " << result;return 0;
}

面试中的应用

        在面试中,你可能不仅要写出这些算法的代码,还需要解释其工作原理和性能特点。对于更高级的面试,你可能需要讨论这些算法的变种,或者在特定情景下如何优化它们。例如,对于堆排序,你可能会被问到如何处理大数据集,或者在归并排序中如何减少内存使用等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】P2 Python3 安装使用

目录 新手教程开发教程 本篇博客文章划分为两个主要部分&#xff1a; 【新手教程】旨在为 Python 编程的新手提供指导&#xff0c;适合于初学者入门&#xff0c;但不太适合用于开发大型项目&#xff1b;【开发教程】则面向那些已经有项目开发经验或者希望迅速提升开发技能的读…

BUUCTF-Real-[ThinkPHP]5-Rce

1、ThinkPHP检测工具 https://github.com/anx0ing/thinkphp_scan 漏洞检测 通过漏洞检测&#xff0c;我们发现存在rce漏洞&#xff01; 2、漏洞利用 ---- [!] Name: Thinkphp5 5.0.22/5.1.29 Remote Code Execution VulnerabilityScript: thinkphp5022_5129.pyUrl: http://n…

新春营销不间断,AI 整活更省心

新年、春节历来都是营销的大热节点&#xff0c;各种好物集、年货节、送礼清单比比皆是。这些新鲜玩法的背后是大量的品牌内容「弹药库」。 然而&#xff0c;品牌想在竞争激烈的新春季刷满存在感&#xff0c;并非易事。一方面&#xff0c;节日期间&#xff0c;消费者对于内容的审…

MySQL造数方法

在MySQL中&#xff0c;若要生成大量测试数据&#xff0c;可以使用以下几种方法&#xff1a; 1、手动插入多行数据&#xff1a; INSERT INTO your_table (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), -- 重复此模式以添加更多行 (…

Tensorflow2.0笔记 - where,scatter_nd, meshgrid相关操作

本笔记记录tf.where进行元素位置查找&#xff0c;scatter_nd用于指派元素到tensor的特定位置&#xff0c;meshgrid用作绘图的相关操作。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#where操作查找元素位置 #输入的tensor是Tr…

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树 蓝桥杯备赛 | 洛谷做题打卡day24 文章目录 蓝桥杯备赛 | 洛谷做题打卡day24[NOIP2003 提高组] 加分二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定思路 题解代码我的一些话 [NOI…

Python数据可视化库之holoviews使用详解

概要 数据可视化在各个领域中都起着至关重要的作用&#xff0c;无论是用于数据分析、科学研究、教育还是决策支持。Python作为一门强大的数据科学工具&#xff0c;拥有众多的可视化库。其中&#xff0c;HoloViews是一个备受欢迎的库&#xff0c;它可以轻松创建交互性可视化&am…

PE文件结构 安全分析与恶意软件研究 逆向工程 优化与性能调整 兼容性与移植性分析

了解PE&#xff08;Portable Executable&#xff0c;可移植可执行文件&#xff09;文件结构有多个用途 对于软件开发、安全分析、逆向工程等领域的专业人士来说尤其重要。PE文件格式是Windows操作系统中用于可执行文件、动态链接库&#xff08;DLLs&#xff09;、以及其他文件…

安全防御第五次作业

拓扑图及要求如下&#xff1a; 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致双机热备时&#xff0c;请确保vrrp配置的虚拟IP与下面的ip在同一网段如果其中一台防火墙有过配置&#xff0c;最好清空或重启&…

C语言指针学习(1)

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…

ES证书过期,错误信息: current license is non-compliant for [security]

ES证书过期 一、背景二、解决 一、背景 参考: https://blog.csdn.net/jsugs/article/details/124291689 es日志报错信息&#xff1a;current license is non-compliant for [security] ES的X-pack许可证是提供免费一个月的试用&#xff0c;但是到期之后&#xff0c;就会报这…

【Leetcode 514】自由之路 —— 动态规划

514. 自由之路 电子游戏“辐射4”中&#xff0c;任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘&#xff0c;并使用表盘拼写特定关键词才能开门。 给定一个字符串ring&#xff0c;表示刻在外环上的编码&#xff1b;给定另一个字符串key&#xff0c;表…

mac上,配置bundletool,将aab转为apk

1.第一步打开终端&#xff0c;安装brew 2.安装bundletool brew install bundletool 3.aab转apk bundletool build-apks --bundle/MyApp/my_app.aab --output/MyApp/my_app.apks 如果下载了bundletool--xxx.jar&#xff0c;脚本命令前加 java -jar bundletool-all-1.5.0.j…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(三)NodeJS入门——http协议

033_HTTP协议_初识HTTP协议 hello&#xff0c;大家好&#xff0c;这个小节我们来认识一下 http协议。 http是几个单词的首字母拼写&#xff0c;全称为Hypertext Transfer Protocol 译为超文本传输协议&#xff0c;那么这个http协议是互联网上应用最广泛的协议之一。顺便说一下…

rancher证书过期问题处理

问题 起初&#xff0c;打开rancher ui页面打不开&#xff0c;telnet rancher的服务端口也不通。查看rancher 控制节点&#xff0c;日志显示&#xff0c;X509&#xff1a;certificate has expired or is not ye valid。证书已过期 解决 现在网上大部分的解决方案都是针对的2…

TSINGSEE青犀智能分析网关V4如何利用AI智能算法保障安全生产、监管,掀开安全管理新篇章

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

【TI毫米波雷达】CLI模块初始化,demo工程覆写CLI控制指令代码的操作方式(以IWR6843AOP为例)

【TI毫米波雷达】CLI模块初始化&#xff0c;demo工程覆写CLI控制指令代码的操作方式&#xff08;以IWR6843AOP为例&#xff09; 本文主要针对demo工程 通过覆写CLI配置 跳过CLI配置命令 以此来达到自动配置参数 并控制雷达的功能 在此期间不开启CLI和相关初始化 只是针对CLI控…

【PostGIS】PostGIS数据模型

postgis的几何类型和ogc的集合类型相对应&#xff0c;postgis的几何类型是ogc的超集postgis将几何类型分为笛卡尔平面几何geometry和地理图形geography&#xff1b;geometry存储xy坐标&#xff0c;geography存储lonlat坐标&#xff1b;geometry支持的类型多于geography类型对三…

华为配置ARP安全综合功能实验

配置ARP安全综合功能示例 组网图形 图1 配置ARP安全功能组网图 ARP安全简介配置注意事项组网需求配置思路操作步骤配置文件 ARP安全简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和A…

在深度学习中,epoch和learning rate的通常取值范围?

在深度学习中&#xff0c;epoch和学习率的取值确实会根据不同的任务、数据集和模型架构有所不同。然而&#xff0c;您提到的范围是一些常见的经验性取值&#xff0c;这些取值在很多情况下都能工作得相当好。 1. 对于epoch的取值范围&#xff1a; 在很多研究论文和实际应用中&…