数据结构与算法(C++)
文章平均质量分 51
火焰山大白菜
事物的难度远远低于对事物的恐惧!
展开
-
数据结构与算法论持久战(C++版)-进阶高手的大门
今天开始,也陆续更新数据结构篇记录笔记,开篇简单的说了下数据结构与算法对于一个工程师的重要性,那现在我们来想一下:程序的本质是什么? 客观上来讲,程序就是由一堆字符加符号组合成的英文文章;主观来说,就是解决问题的步骤,想想一个古老的脑经急转弯:怎么把大象放冰箱里?用程序来描述,就是三条语句:open -> put -> close。这就是把大象放冰箱里...原创 2018-04-18 07:25:42 · 297 阅读 · 0 评论 -
排序算法之 - 希尔排序(基于选择排序,插入排序)
之前说的选择,插入,冒泡三种基本排序,时间复杂度都为O平方,直到希尔排序的出现,打破了O平方的魔咒.希尔排序的基本思想我理解是属于分而治之,把一个无序序列划分为若干个子序列,再分别对这写子序列使用三种基本排序方法进行排序.下边直接看示意图:要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序为升序排序第一次划分:假设间隔d = ...原创 2019-05-12 23:24:19 · 740 阅读 · 0 评论 -
排序算法之 - 冒泡排序
与选择排序,插入排序一样,冒泡排序也是常规的排序法之一,冒泡排序的思想主要放在"冒泡"二字. 这个冒泡排序算法有点想水中的泡泡往上冒一样,水中的泡泡月往上变得越大,冒泡排序思想跟这个是一样的. 冒泡排序思想:取最后一个元素,往前遍历并与遍历的元素比较,符合交换规则(或大或小),那么交换位置,接着往前遍历,知道遍历到已经排好序的序列为止,那么此时这个元素就是极大/极小值,也就...原创 2019-05-12 12:16:04 · 353 阅读 · 0 评论 -
排序算法之 - 插入排序
与选择排序,冒泡排序一样,插入排序也是常规的排序法之一,插入排序的思想主要放在"插入"二字,主要就是从待排序列中取第一个待排元素,然后与其前面已排序列的元素比较,比较成功(或大或小),那么就把这个已排元素往后挪一个位置,空出来的位置就是插入的位置,依次循环.下边来看个示意图: 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序...原创 2019-05-12 11:48:19 · 191 阅读 · 0 评论 -
排序算法之 - 选择排序
所谓排序,就是把一系列同类型的元素按照一定规则顺序排好.选择排序也是其中的方法之一,选择排序的思想主要放在"选择"二字,主要就是从待排序的序列中寻找最大/最小值,然后放到已经排好序的下一个交换位置,下边来看个示意图: 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14}; (红色代表已排序列,黑色代表待排序列,绿色代表...原创 2019-05-11 22:41:52 · 197 阅读 · 0 评论 -
C++数据结构-单链表创建
前边我们创建了顺序存储结构的线性表,简称顺序表,顺序表最大的问题是:插入和删除需要移动大量的元素。为了解决 这个问题, 我们引入链式存储结构的线性表,简称链表,链表与顺序表不同,链表的每个结点在内存中是分开存放的,每个结点都包含数据域和指针域: - 数据域 :存储数据元素本身 - 指针域 :存储相邻结点的地址链式存储结构的线性表有 - 单链表:每个结点只包含...原创 2018-08-22 00:20:25 · 9124 阅读 · 2 评论 -
C++数据结构-线性表顺序存储结构设计
线性表的顺序存储结构:指的是用一段地址连续的存储单元一次存储线性表中的数据元素,如下:有了以上概念,我们可以使用一维数组来实现线性表的顺序存储结构, 存储空间:T* m_marry 当前长度:int m_length整个类继承于之前我们写的List类,并采用泛型编程,在这里我们把顺序表分为静态顺序表与动态顺序表,静态顺序表的存储空间是直接在栈上分配的,通过类模板来定义空间长...原创 2018-08-13 23:40:32 · 1113 阅读 · 0 评论 -
C++数据结构数组类的创建
在C或C++的原生数组里,有一点不好的就是数组越界是察觉不到,代码也不会提醒,至于越界产生的bug什么时候引发系统问题,我们也无从知晓。在这里我们可以创建一个数组类,内部包含数组长度、数组越界访问时能主动发现。 数组类的创建我们还是按照顺序表的思路,创建一个Array类,实现基本的操作,再创建StaticArray与DynamicArray一个静态一个动态数组类,数组存储位置及大...原创 2018-08-18 20:30:23 · 5035 阅读 · 0 评论 -
C++数据结构线性表的本质和操作
线性表(List)定义:具有相同类型的n(n≥0)个数据元素的有限序列 (a0, a1, a2, ... , an-1),ai是数据元素,n是表长度线性表(List)具有如下性质: - a0为线性表的第一个元素,只有一个后继 - an-1 为线性表的最后一个元素,只有一个前驱 - 除了a0与an-1外的其他元素ai,既有前驱又有 后继 - 直接支持...原创 2018-08-12 23:29:51 · 366 阅读 · 0 评论 -
C++数据结构类族结构的进化
我们在MyLib数据结构内定义了顶层父类MyObject,数据结构中的所有子类都继承于MyObject顶层父类,前边我们定义的智能指针类SmartPointer、异常类ExcepTion都要稍作改动(这里代码不再显示,直接在对应的篇章中继承自MyObject类即可),将他们继承于MyObject类,确保MyLib 中的所有类位于单一的继承树。LMSLib数据结构库的开发方式 - 单一继承...原创 2018-08-12 22:41:56 · 531 阅读 · 0 评论 -
C++数据结构顶层父类的创建
至于为什么要创建一个顶层父类,在当代软件架构实践中的经验 - 尽量使用单重继承的方式进行系统设计 - 尽量保持系统中只存在单一的继承树 - 尽量使用组合关系代替继承关系但是C++编译器的差异,使得同样的代码可能表现不同的行为,例如new操作失败后,不同的编译器,可能返回NULL空指针,也了能抛出一个固定的异常。这就导致代码的移植性变差,所以我们要创建一个 顶层父...原创 2018-08-12 21:49:31 · 505 阅读 · 0 评论 -
C++数据结构异常类的构建
前边我们知道,C++中的异常类型有基本数据类型,除此之外,也可以是自定义类类型,对于类类型异常的匹配依旧是至上而下严格匹配,父子间的赋值兼容性原则在异常匹配中依然适用,也就是说抛出的子类异常,catch语句中可以使用父类类型接收处理。 一般的设计原则是:匹配子类异常的catch放在上部;匹配父类异常的catch放在下部try{ throw child; //抛...原创 2018-08-12 20:06:46 · 503 阅读 · 0 评论 -
C++中的异常
代码中的异常与错误的区别,异常是可预见的,错误是不可预见的。C++内置了异常处理语法 元素try...catch... - try 语句处理正常代码逻辑 - catch语句处理异常情况 - try 语句中的异常由对应的catch语句处理try{ double r = divide(1, 0);}catch(...){ cout <...原创 2018-08-12 18:26:08 · 278 阅读 · 0 评论 -
C++模板技术之智能指针示例
我们知道,软件开发中的内存泄漏是最严重的Bug之一,内存泄漏主要因为如下三点引起的: - 动态申请堆空间,用完后不归还 - C++语言中没有垃圾回收的机制 - 指针无法控制所指堆空间的生命周期 在当代的C++软件平台中的智能指针 - 指针生命周期结束时主动释放堆空间 - 一片堆空间最多只能由一个指针标...原创 2018-08-12 11:18:05 · 508 阅读 · 0 评论 -
泛型编程简介
在数据结构中,很大的一个特点就是只专注于数据元素之间的关系及特定结构上的算法,并不关注数据元素的具体类型。鉴于这个特点, 不考虑数据类型的泛型编程就非常适合用于数据结构。 泛型编程是不考虑具体数据类型的编程方式 例如对于交换两个数值的函数Swap,就可以考虑下边的泛型写法void Swap(T& a, T& b){ T temp; ...原创 2018-08-12 10:04:14 · 764 阅读 · 0 评论 -
排序算法之 - 归并排序
这一章节所讲的归并排序,跟希尔排序一样,也是一种效率很高的排序方法,也同样采用了分而治之的方法.归并排序的基本思想为:先把无序序列一分为二,然后分别对两边的序列进行排序,最后再整合两边已经排好的序列.下边已一张图来展示归并排序的思想(图是借用网友的,见做的非常简洁易懂,便引用之)从途中我们看到,二分后的两边序列,又进行二分归并处理,直到两边的序列不能二分为止.这就是采用的递归思想,出...原创 2019-05-12 23:52:06 · 177 阅读 · 0 评论