带你深入浅出新面经:十五、十大排序之堆排序

news2024/12/24 21:34:28

此为面经第十五谈!关注我,每日带你深入浅出一个新面经。

我们要了解面经要如何“说”

很重要!很重要!很重要!

我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)

码农不易,各位学者学到东西请点赞支持支持

排序算法部分可以记忆简单过程概述。

开始部分:

总:堆排序通过构建最大堆,然后逐步将堆顶元素与数组尾部元素交换并重新调整堆,直到完成排序。

分:

最好时间复杂度就是(n*k)

最差时间复杂度就是(n*k)

平均时间复杂度也是(n*k)

空间复杂度:n+k

稳定性:稳定。

#include <iostream>
#include <vector>
#include <algorithm> // 用于std::swap

using namespace std;

// 调整堆结构,确保堆的性质
void adjustHeap(vector<int>& arr, int i, int n) {
    int temp = arr[i]; // 暂存当前节点值
    for (int k = 2 * i + 1; k < n; k = k * 2 + 1) { // 从i节点的左子节点开始,也就是2i+1位置
        if (k + 1 < n && arr[k] < arr[k + 1]) k++; // 如果有右子节点且右子节点值较大,则选择右子节点
        if (arr[k] > temp) { // 如果子节点大于父节点
            arr[i] = arr[k]; // 将较大的子节点值放到父节点上
            i = k; // 继续向下调整
        } else break; // 子节点小于父节点,调整结束
    }
    arr[i] = temp; // 将暂存的值放到最终位置
}

// 堆排序函数
void heapSort(vector<int>& arr) {
    int n = arr.size(); // 获取数组长度
    for (int i = n / 2 - 1; i >= 0; i--) { // 从最后一个非叶子节点开始调整为最大堆
        adjustHeap(arr, i, n);
    }
    for (int j = n - 1; j > 0; j--) { // 交换堆顶元素与最后一个元素
        swap(arr[0], arr[j]); // 交换操作
        adjustHeap(arr, 0, j); // 重新调整堆
    }
}

// 主函数,用于测试堆排序
int main() {
    vector<int> arr = {3, 2, 5, 1, 7, 4, 6};
    cout << "Original array: ";
    for (int num : arr) cout << num << " ";
    cout << endl;

    heapSort(arr); // 调用堆排序函数

    cout << "Sorted array: ";
    for (int num : arr) cout << num << " ";
    cout << endl;

    return 0;
}

堆排序的步骤可以简化为以下几个关键点:

  1. 调整堆结构adjustHeap 函数用于将给定的数组元素调整为满足堆的性质,即父节点的值总是大于或等于其子节点的值(在最大堆中)。

  2. 构建最大堆:在 heapSort 函数中,从数组的最后一个非叶子节点开始,向下调用 adjustHeap 函数,逐步调整整个数组为一个最大堆。

  3. 交换并重新调整:将堆顶元素(最大值)与数组的最后一个元素交换,然后减少堆的有效长度,并重新调整堆结构以保持最大堆的性质。

  4. 重复交换与调整:重复步骤 3,直到堆的大小减少到只剩下一个元素,此时整个数组就变成了有序的。

总:排序可视化网站(建议打开看着代码来了解)Heap Sort Visualization

看着排序过程来理解代码实现会更好。

  学习链接:https://xxetb.xetslk.com/s/3Kif2D

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

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

相关文章

Linux--find命令-搜索

find 命令 用来在指定目录下查找文件 如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件&#xff0c;并且将查找到的子目录和文件全部进行显示 find <指定目录> <指定条件> <指定动作> 默认是搜索当前目录…

C语言:编程世界的基石

在计算机科学的世界里&#xff0c;C语言就像一座坚固的桥梁&#xff0c;连接着硬件和软件的两端。自从20世纪70年代诞生以来&#xff0c;C语言以其简洁、高效和强大的特性&#xff0c;成为了编程领域的经典之作。本文将探讨C语言在不同工作领域中的应用&#xff0c;以及它为何能…

opensatck上windows云主机上java服务的端口调用问题处理

文章目录 前言一、思路二、解决步骤1.将安全组规则全部放开2.云主机内部防火墙关闭3.尝试telnet4.查看代码&#xff0c;修改IP配置 总结 前言 opensatck上windows云主机上java服务的端口调用问题处理。同事在window10的云主机中用idea起了调试中的服务&#xff0c;端口在8000&…

鸿蒙操作系统为前端开发者带来下一个风口

在科技飞速发展的当下&#xff0c;前端开发领域也在不断寻求新的突破和机遇。而鸿蒙操作系统的崛起&#xff0c;无疑为前端开发者带来了下一个令人瞩目的风口。 一、鸿蒙系统的独特优势 1. 分布式架构 鸿蒙系统的分布式架构打破了传统设备之间的界限&#xff0c;使得不同设备可…

了解如何使用 Google 的 Gemini-1.5-pro 最新模型开发用于卡路里计算的生成式 AI 应用

欢迎来到雲闪世界。 例如&#xff0c;你有没有想过&#xff0c;当你吃晚餐时&#xff0c;你摄入了多少卡路里&#xff1f;我经常这样做。如果你能简单地通过应用程序发送一张你的盘子照片&#xff0c;并在你决定要吃多少之前得到卡路里总量的估计值&#xff0c;那不是很棒吗&am…

springboot依赖之JDBC(二)

要在 IntelliJ IDEA 中创建一个 Spring Boot 项目并实现基于 JdbcTemplate 的增删改查功能&#xff0c;以下是一个详细的步骤和代码示例。这个例子使用一个简单的用户信息表&#xff08;users&#xff09;&#xff0c;并展示如何使用 JdbcTemplate 的各种方法进行操作。 前文有…

【Linux —— 生产者消费者模型】

Linux —— 生产者消费者模型 生产者消费者模型概述生产者消费者模型特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型 生产者消费者模型概述 生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者…

Python 3.11 从入门到实战1(环境准备)

本篇文章是python3.11的学习开篇&#xff0c;我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;获得python基础学习与实例、实践相结合&#xff0c;使我们完全掌握python。并做到独立完成项目开发的能力。 今天的谈论的比较简单&#xff0c;也是后续学习的基础。pyt…

深入MySQL

MySQL逻辑架构 MySQL逻辑架构整体分为三层&#xff0c;顶层客户端并非MySQL独有&#xff0c;如&#xff1a;连接处理、授权认证、安全等功能都在客户端层。 核心服务层&#xff0c;MySQL大多数核心服务都在这一层&#xff0c;包括查询解析、分析、优化、缓存、内置函数等。所有…

Python中csv文件的操作5

在《Python中csv文件的操作1》中提到&#xff0c;可以通过read()和write()方法读取和写入csv文件中的所有内容。除了上述的两个方法外&#xff0c;还可以通过readline()、readlines()、writelines()实现csv文件的读写操作。 1 readline()方法 readline()方法每次只读取文件的…

入行「游戏策划」,该从何处下手?

想知道策划岗位该怎么入行可点击蓝链 相比较起以技术为最重要评判标准的开发岗&#xff0c; 「游戏策划」这一岗位在非业界人士的眼中 一直都是一个风评方差很大的岗位。 有人说策划岗又轻松又威风&#xff0c; 只需要输出想法&#xff0c;落地都交给开发&#xff0c; 干…

xss-labs 11-15关通关攻略

第11关 一.进入11关 二.进行抓包 在抓到的数据包中加入Referer:"οnclick"alert(1)"type"text 第12关 进入第12关发现没有注入点&#xff0c;进入源代码看哪里可以注入发现 二.在ua头注入 Referer:"οnclick"alert(1)"type"text…

【鸿蒙样式初探】多个组件如何共用同一样式

最近开发鸿蒙&#xff0c;刚接触难免二和尚摸不着头脑&#xff0c;尤其是样式...... 背景 在做银行卡显示的一个小需求时&#xff1a; 每个Text都需要设置fontColor:#FFFFFF" 想着是否可以简单点 解决历程 思路一&#xff1a;&#xff08;拒绝) 使用Styles 提取封装公…

matlab仿真 信道编码和交织(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; ​ ​ ​ clear alln3;k2;%A(3,2)循环码N10000;%消息比特的行数msgrandi([0 1],N,k);%消息比特一共N*k行polcyclpoly(n,k);…

C++ TinyWebServer项目总结(12. 高性能I/O框架库Libevent)

Linux服务器程序必须处理三类事件&#xff08;I/O、信号和定时事件&#xff09;&#xff0c;在处理这三类事件时需要考虑以下问题&#xff1a; 统一事件源。统一处理这三类事件既能使代码简单易懂&#xff0c;又能避免一些潜在的逻辑错误。实现统一事件源的一般方法&#xff1…

如何用Java SpringBoot+Vue搭建花开富贵花园管理系统

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

推荐一篇 学习SQL 的文章

学习 java&#xff0c;当然避不开数据库的知识&#xff0c;个人认为好学好理解的一篇文章&#xff0c;推荐给大家 SQL语法基础知识总结 | JavaGuide「Java学习 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试&#xff0c;首选 JavaGuide&#xf…

智能优化算法-鹈鹕优化算法(POA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 鹈鹕优化算法 (Pelican Optimization Algorithm, POA) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了鹈鹕的捕食行为和社会交互特性&#xff0c;用于解决复杂的优化问题。 POA的工作机制主要包括…

单元测试、系统测试和集成测试知识详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff…