笔记
C/Cpp的奇妙冒险
待业转型男青年
展开
-
数据结构之快速排序
快速排序 quick sort原理与图解代码实现算法分析快排的优化快排与归并的比较原理与图解快速排序从程式上看起来和归并排序特别像,都采取了递归分治的思想,将数据逐步分解。快排首先在序列中选定某一个枢轴(pivot),然后将除枢轴位置的数据与枢轴数据比较,大于的放在右边,小于的放在左边,然后分两边再次递归,直到递归数据个数趋为1,这样数据就排好序了。代码实现void QuickSort(int arr[], int num);void quicksort(int arr[], int head原创 2020-09-24 21:54:53 · 540 阅读 · 1 评论 -
数据结构之归并排序
归并排序(MergingSort)原理与图解数组的归并排序实现单向链表的归并排序原理与图解归并排序的核心思想就是分治思想,将一个长序列二分,逐步细分成单个数字,充分利用递归的压栈原理,逐步分解实现分这个思想,然后根据最后的分解逐步向上合并,达到治的目的,归并排序的方法是递归,实现的核心手段则是分而治之。数组的归并排序实现void merge(int arr[], int head, int mid, int tail){ int size = tail - head + 1;原创 2020-09-24 20:23:37 · 222 阅读 · 0 评论 -
数据结构之选择排序
选择排序 Selection Sort图解与原理实现分析图解与原理选择排序应该是最容易实现的一种排序方法,其原理很简单,依旧分为两块数据,左边选取数据与右边的数据进行比较,取最小值,比较到最后的位置后交换数据,确保每一次比较中最小值都会调整到左边并有序增加,实质上就是取最小值的函数,只不过外层包了一个循环。实现void SelectionSort(int arr[], int n){ if(n <= 1) return; for (int i = 0; i原创 2020-09-23 00:25:44 · 172 阅读 · 0 评论 -
数据结构之插入排序
插入排序(Insertion Sort原理与图解插入排序的C++实现插入排序的复杂度分析原理与图解原理:插入排序其实就是将冒泡排序包装了一下,冒泡排序是利用两个数据对比之后立马进行交换,而插入排序利用数据对比但推迟了数据移动的时机,插入排序移动的时机在于当出现第一个较小的数据才发生整体的数据迁移,插入排序将序列分为左右两块,左边朝最低端递减,右边则只需要取一个数据比较。插入排序的C++实现void InsertSort(int arr[], int n){ if(n <= 1)原创 2020-09-23 00:08:14 · 329 阅读 · 0 评论 -
数据结构之冒泡排序
排序算法的稳定性:在序列中存在几个数据相同的数据,经过排序之后这几个数据出现的顺序依旧没发生改变,则称该算法为稳定的排序算法,否则为不稳定的排序算法。排序算法的空间复杂度:排序算法在排序过程中消耗的内存可以通过其空间复杂度表现,特指空间复杂度O(1)的排序算法为原地排序。冒泡排序(Buddle Sort)图解与原理冒泡排序的代码实现冒泡排序的复杂度分析冒泡排序的优化图解与原理冒泡排序的主要原理就在于从序列的最低部开始,与之上位的数据进行大小比较,如果上位的数据小于低位的则发生一次数据交换,.原创 2020-09-22 23:32:43 · 619 阅读 · 0 评论 -
数据结构之队列
队列(queue)队列的复杂度分析链式队列的实现循环队列的C++实现循环队列中利用数学求size队列与栈类似,也是比较好理解的数据结构,它的特性是先进先出(First in First out),也仅仅支持两个操作入队(enqueue)和出队(dequeue),同样其实现形式依据数组和链表分为顺序队列和链式队列队列的复杂度分析队列的时间复杂度其实很简单,由于入列是从尾部加入,出列是从头部出列,并没有从任意部位插入与删除的情况出现,因此其入列与出列的时间复杂度均为O(1)。链式队列的实现#prag原创 2020-09-21 22:40:25 · 199 阅读 · 0 评论 -
数据结构 数组
数组数组的时间复杂度容器与数组手动实现数组功能数组是线性表的数据结构,利用一组连续的内存空间存储一组具有相同类型的数组。也正因为这种特性使得数组在内存上的存储有一定的限制,无法利用零碎的内存空间存储某些数据。数组的时间复杂度数组因为支持随机访问,根据数组下标的随机访问使得其时间复杂度为O(1)数据插入:假定数组的长度为N,当需求将某个数据插入到K(k<n)位置上时,前K个位置的数据位置维持原样保持不变,但K~N位置的数据需要往后移一个位置给该数据,因此虽然读取K位置的数据方便,但是在插原创 2020-09-18 21:31:01 · 125 阅读 · 0 评论 -
数据结构 链表(一)
链表链表的时间复杂度单向链表与双向链表单向链表与双向链表的比较链表与数组的比较单向链表的C++实现反转单向链表图解链表是通过分布在内存各个位置上不同节点相互连接成的一种线性表的数据结构,其特性突出表现为内存分布零散,因此在数据存储对内存要求相较于数组而言较低。链表的时间复杂度数据插入:链表的数据的内存由于是分散的,因此在插入过程中只需要考虑前后数据指针的改变即可,不用考虑插入节点后的数据迁移工作,因此链表单纯的插入操作的时间复杂度是O(1),但是因为数据的查找访问需要遍历整个链表,因此在链表中任意原创 2020-09-18 23:35:52 · 136 阅读 · 0 评论 -
数据结构 链表(二)
链表双向链表的C++实现#pragma oncetypedef struct Node{ int value; Node* prev; Node* next;}node;class DoubleLinklist{private: int size; node* head; node* tail;public: DoubleLinklist(); ~DoubleLinklist(); //获取链表大小 int GetSize(); //判断是否为空 bool IsE原创 2020-09-19 22:38:53 · 95 阅读 · 0 评论 -
数据结构之栈
栈栈的复杂度分析顺序栈的C++实现链式栈的C++实现数据集合从一端插入以及删除,满足后进先出(Last in First out)的特性,栈只有两个操作,入栈(push)和出栈(pop),在实现形式上有依托数组实现的顺序栈与依托链表实现的链式栈栈的复杂度分析入栈:栈的入栈操作只是在数据末尾添加数据,在未达到边界条件下是以直接插入的形式进行,没有数组的随机访问的特性,因此入栈的时间复杂度为O(1)出栈:栈的弹出只能由结构中的尾部直接弹出删除,并不能从中间或者头部实现弹出操作,因此出栈的时间复杂度也为原创 2020-09-21 21:59:19 · 149 阅读 · 0 评论 -
2020 我的C++的学习之路 第十章 对象和类
以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆。对象和类过程性编程与面向对象编程对象和类类类声明实现类成员函数方法与对象类的构造函数与析构函数声明和定义构造函数使用构造函数默认构造函数(defult constructor)析构函数(destructor)const成员函数C++11列表初始化this指针对象数组过程性编程与面向对象编程过程性编程:首先考虑要遵循的步骤,然后考虑如何表示这些数据面向对象编程:首先从用户的角度考虑对象,描述对象所需的数据以及描述用户与数据交互所需的原创 2020-05-24 13:40:30 · 212 阅读 · 0 评论 -
2020 我的C++的学习之路 第九章 内存模型与名称空间
以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆。内存模型与名称空间存储持续性作用域与链接自动存储持续性静态持续变量静态持续性、外部链接性静态持续性、内部链接性静态持续性、无链接性说明符和限定符存储说明符cv-限定符定位new运算符名称空间using声明与using编译指令名称空间的其他特性未命名的名称空间存储持续性①自动存储持续性:在函数定义中声明的变量的存储持续性为自动,在程序开始执行所属的函数或代码块 时被创建,在执行完函数或代码块时,它们的内存被释放原创 2020-05-22 10:31:00 · 220 阅读 · 0 评论 -
2020 我的C++的学习之路
以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆。第四章 复合类型4.1 数组数组(array)是一种数据格式,存储多个同类型的值。声明数组应指出数组中元素的类型,元素数量以及数组名称。声明格式:TypeName ArrayName[ArraySize] ,其中ArraySize必须为整型常量或者const值或常量表达式,即所有的值在编译时已知,不能为变量。数组的初始化规则:① 只有定义数组才能使用初始化,不能将一个数组赋给另一个数组,但可以用数组下标分别赋值;② 初始原创 2020-05-14 11:36:45 · 197 阅读 · 0 评论 -
2020 我的C++的学习之路 第八章函数
以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆。第八章 函数探幽1 内联函数2 引用变量2.1 创建引用变量2.2 引用与函数参数2.3 引用与结构何时使用引用参数默认参数函数重载函数模板显式具体化实例化与具体化编译器选择哪个函数版本完全匹配和最佳匹配部分排序规则关键词decltype(C++11)后置返回类型(C++11)1 内联函数常规的函数调用使程序跳到一个地址并在结束时返回,对于内联函数而言,程序无需跳转即可执行,因此内联函数运行速度比常规函数稍快,但代价是占用更原创 2020-05-20 21:57:00 · 166 阅读 · 0 评论