C++与算法
文章平均质量分 89
蜡笔小马
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解蒂姆排序算法:C++实现与性能分析
摘要 蒂姆排序(TimSort)是一种高效的混合排序算法,结合了插入排序和归并排序的优点。它通过将数组分割为多个有序子序列(run),先对小规模run使用插入排序,再通过归并排序合并run。该算法在最好情况下时间复杂度为O(n),平均和最坏情况均为O(n log n),空间复杂度为O(n)。TimSort具有稳定性、自适应性和卓越的实际性能,已成为Python、Java等系统的默认排序算法,特别适合处理部分有序数据。不过它需要额外空间且实现较复杂,需要合理设置参数才能发挥最佳性能。原创 2025-10-27 10:07:40 · 594 阅读 · 0 评论 -
深入解析内省排序:C++实现混合排序算法的终极指南
没有完美的算法,只有合适的策略。通过智能地结合快速排序、堆排序和插入排序,它实现了在理论保证和实际性能之间的完美平衡。原创 2025-10-27 09:52:14 · 808 阅读 · 0 评论 -
从“堆”里拔出最大值:C++手写 HeapSort 的完全指南
现在,当你再看到最后一棵非叶子树开始“下沉”;根与末尾交换,最大值被“摘下”;新根一路沉到属于自己的位置。代码不再是黑箱,而是可视化的“堆山摘顶”流水线。把它拷贝进你的工程,让最大值像旗杆一样被拔出,再稳稳插到数组末尾——排序,也可以这么有仪式感。/*** @brief 实现堆排序算法的类* 这个类提供了使用堆排序算法对数组进行排序的方法,* 堆排序是一种基于比较的排序算法,时间复杂度为 O(n log n)。原创 2025-10-27 09:25:44 · 1134 阅读 · 0 评论 -
深入浅出:C++手搓归并排序——从“分治”哲学到工业级泛型实现
读完,你不仅能随手写出一份“面试官挑不出刺”的归并排序,更能把“分治”思想迁移到海量场景——从外部排序到并行计算,从逆序数统计到链表排序。把牌堆不断对半分,直到每人只剩一张(天然有序),再两两合并,合并时按顺序捋一遍,最后整副牌就自然有序了。做外部排序,还是在 GPU 上并行归并,你都能从这份模板出发,游刃有余。想象一下,你手里有一副洗乱的扑克牌,要求你在最短的时间内把 52 张牌按点数从小到大排好。至此,归并排序的“分治”哲学已融化在你的 C++ 工具箱里。劈成两半,递归下去,直到子区间长度 ≤1。原创 2025-10-26 18:59:35 · 811 阅读 · 0 评论 -
16.C++11线程—在线程间共享数据(笔记)
在并发编程中,操作由两个或多个线程负责,它们争先让线程执行各自的操作,而结果取决于它们执行的相对次序,所有这种情况都是条件竞争。有时候,这直观、易懂,因为诸多互斥的用途各异,也会出现棘手的状况,例如,运用多个互斥分别保护多个独立的实例,这些实例属于同一个类。可是,如果选用了固定的次序(两个对象通过参数传入,我们总是先给第一个实例的互斥加锁,再轮到第二个实例的互斥),前面的建议就适得其反:针对两个相同的实例,若两个线程都通过该函数在它们之间互换数据,只是两次调用的参数顺序相反,会导致它们陷入死锁!原创 2024-12-01 19:54:48 · 911 阅读 · 0 评论 -
15.C++11线程—线程管控(笔记)
然而分离的线程确实仍在后台运行,其归属权和控制权都转移给C++运行时库(runtime library,又名运行库),由此保证,一旦线程退出,与之关联的资源都会被正确回收。假如代码必须确保新线程先行结束,之后当前线程的函数才退出,那么关键在于,全部可能得退出路径都必须保证这种先后次序,无论是正常退出,还是抛出异常。全序关系,简称全序,又名线性序、简单序或非严格排序,是在集合上的反对称的、传递的和完全的任何二元关系。作为参数,它被复制到属于新线程的存储空间中,并在那里被调用,由新线程执行。原创 2024-12-01 19:51:53 · 1056 阅读 · 0 评论 -
14.Boost-内存管理(笔记)
计算机系统中资源又很多种,内存是我们最常用到的,此外还有文件描述符、socket、操作系统handler、数据库连接等等,程序中申请这些资源后必须及时归还系统,否则就会产生难以预料的后果。public:public:的接口和功能几乎是与scoped_ptr构造函数接受的指针p必须是 new[] 的结果,而不能是new表达式的结果;没有*、->操作符重载,因为特有的不是一个普通指针;原创 2024-12-01 19:43:36 · 1120 阅读 · 0 评论 -
12.2 Boost-Asio(笔记)
asio库基于前摄器模式(Proactor) 封装了操作系统的selectpoll/epollkqueue等机制,实现了异步IO模型。它的核心类是io_service,相当于前摄器模式中的Proactor角色,asio的任何操作都需要有io_service的参与。在同步模式下,程序发起一个IO操作,向io_service提交请求,io_service把操作转交操作系统,同步地等待。当IO操作完成时,操作系统通知io_service,然后io_service再把结果发回给程序,完成整个同步流程。原创 2024-12-01 19:16:26 · 1061 阅读 · 0 评论 -
11.Win多线程(笔记)
文章目录1.主要函数列表2.线程函数的定义3.线程同步3.1 原子锁3.1.1 相关问题3.1.2 Window 官方说明及相关API3.1.3 原子锁的实现3.1.4 原子锁优缺点3.2 互斥锁3.2.1 概述3.2.2 相关API3.2.3 其他说明3.2.4 示例3.3 事件3.3.1 概述3.3.2 API函数3.3.3 示例3.4 信号量(Semaphores)3.4.1 概述3.4.2 API函数4. 线程池4.1 概念4.1.1 线程的执行流程4.1.2 线程池4.2 线程池API4.2.1原创 2024-12-01 19:12:26 · 1070 阅读 · 0 评论 -
10.排序算法C++(笔记)
这个信息非常关键,因为它告诉我们各个元素应该出现在结果数组的哪个位置。接下来,我们倒序遍历原数组。原创 2024-12-01 18:55:21 · 1186 阅读 · 0 评论 -
12.1 Boost-Thread(笔记)
public:mutex对象在创建后表示了一个互斥量,成员函数lock()用于线程阻塞等待直至获得互斥量的所有权(即锁定);try_lock()尝试锁定互斥量,如果锁定成功返回true,否则返回false,它是非阻塞的;当线程使用完共享资源后,应该及时使用unlock()解除对互斥量的锁定。成员函数只属于和,它的行为结合了lock()和try_lock(),阻塞等待一定的时间试图锁定互斥量,如果时间到还未锁定则发回false。原创 2024-11-28 15:31:44 · 894 阅读 · 0 评论 -
09.搜索算法C++(笔记)
它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。二分查找需要跳跃式(非连续地)访问元素,而在链表中执行跳跃式访问的效率较低,因此不适合应用在链表或基于链表实现的数据结构。例如,二分查找需要预先对数组进行排序,哈希查找和树查找都需要借助额外的数据结构,维护这些数据结构也需要额外的时间和空间开销。对于频繁插入元素的场景,为保持数组有序性,需要将元素插入到特定位置,时间复杂度为。二分查找不仅可用于搜索目标元素,还可用于解决许多变种问题,比如搜索目标元素的插入位置。原创 2024-11-24 20:19:26 · 887 阅读 · 0 评论 -
08.图算法C++(笔记)
无向图中一个连通图的最小连通子图称为生成树。(用最少的边把所有顶点连接起来)。n个顶点的连通图的生成树有n-1条边。路径长度:对于不带权图为路径的边个数。带权图为路径所有边权值的和最小生成树:所有生成树中,路径长度最小的生成树。所以生成树一定是连通图。这个定义是在无向图的基础上开展的。连通图:无向图中,若顶点A、B存在路径,称为A、B连通。若图中的任意两点都是连通的,则称此图为连通图。原创 2024-11-24 20:14:13 · 2269 阅读 · 0 评论 -
07.并查集(笔记)
并查集是一个多棵树的集合(森林)。并查集由多个集合构成,每一个集合就是一颗树。并:合并多个集合。查:判断两个值是否在一个集合中。存储结构:数组初始化:数组元素全部初始化为-1。存储数据:根节点为负数,其绝对值为集合中元素的个数,孩子结点中存放父节点的下标。eg:一共10个人开始时这10个人各为一个集合,没有父节点,这里将数组全部设置为-1。之后,将10个人分成3组,每组以树的形式存储,树的根节点可以任意取。这里假设0 4 5 一组,1 3 6 一组,2 7 8 9 一组。原创 2024-11-24 19:57:18 · 366 阅读 · 0 评论 -
06.堆算法C++(笔记)
如图 所示,节点“从顶至底堆化”的最大迭代次数等于该节点到叶节点的距离,而该距离正是“节点高度”。,我们将根节点的值与其两个子节点的值进行比较,将最大的子节点与根节点交换。需要指出的是,许多编程语言提供的是「优先队列 priority queue」,这是一种抽象数据结构,定义为具有优先级排序的队列。我们首先创建一个空堆,然后遍历列表,依次对每个元素执行“入堆操作”,即先将元素添加至堆的尾部,再对该元素执行“从底至顶”堆化。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能已被破坏,原创 2024-11-24 19:49:39 · 760 阅读 · 0 评论 -
05.哈希表(笔记)
例如,由于加法和异或满足交换律,因此加法哈希和异或哈希无法区分内容相同但顺序不同的字符串,这可能会加剧哈希冲突,并引起一些安全问题。当发生冲突时,平方探测不是简单地跳过一个固定的步数,而是跳过“探测次数的平方”的步数,即**1,4,9…「负载因子 load factor」是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希冲突的严重程度,计算复杂性:哈希函数的计算通常是高效的,但是反向操作——从哈希值到原始输入的计算——在数学上被设计成是一个复杂且耗时的过程。原创 2024-11-24 19:38:13 · 1082 阅读 · 0 评论 -
04.算法范式
算法:按步骤解决问题的过程。范式:思考问题的模式。算法范式:为问题构建高效解决方案的常规方法。算法范式可以被看做为解决一类问题的高层算法。原创 2024-11-24 19:33:40 · 2433 阅读 · 0 评论 -
03.explicit详解
在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显式的,但是, 也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效,原创 2024-11-24 19:31:45 · 267 阅读 · 0 评论 -
02.C++类型识别
C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型。RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持。为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字。转载 2024-11-24 19:28:10 · 455 阅读 · 0 评论 -
01.c++基础
namespace 空间名{名字空间成员1;名字空间成员2;注:名字空间成员可以是全局函数,全局变量,自定义类型,名字空间.free()1) 引用即别名,就是某个变量的别名,对别名操作和对变量本身操作完全相同.2) 语法类型 & 引用名 = 变量名;注: 定义引用时必须初始化,初始化以后绑定的目标变量不能再修改.注: 引用的类型和绑定的目标变量类型一致int &b = a;//b就是a的别名万物皆对象,任何一种事物都可以看做是对象.原创 2024-11-24 19:25:16 · 2161 阅读 · 0 评论
分享