sunzhongliang

好心态才有好状态

常见排序算法

冒泡排序(Bubble Sort) 冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,如果比较条件不满足就让它俩互换位置, 一次冒泡会让至少一个元素移动到它应该在的位置,重复n次就可以让n个数据有序排列 举个例子 比如要对[1,11,88,5,32]这几个元素按照从小到大的顺序排列,该怎样排序呢? 经过上述第一轮操作,那么我们已经把这个数组中的最大元素位置放好了,...

swift-内存管理

内存管理 Swift同OC一样,也是基于引用计数的ARC内存管理方案(堆空间), Swift中的ARC有3种引用: 强引用(strong reference) 默认情况下,引用都是强引用 弱引用(weak reference) 通过weak定义弱引用; 必须是可选类型的var,因为实例销毁后,ARC会自动将弱引用置为nil...

数据结构-哈希表

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 哈希表(HashTable) 在讲HashTable先来看一个简单的需求 请设计出一个办公楼的通讯录,存放此办公楼所有公司的通讯信息,座机号码作为key(最长10位),公司详情(名称、地址)作为value,要求添加、删除、搜索的时间复杂度是O(1)级别 思考: 由于要实现O(1)复杂度的查找、添加、删除操作,常规...

数据结构-二叉树

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 树(Tree) 树又分为以下几种: 有序树 树中任意节点的子节点之间有顺序关系 无序树 树中任意节点的子节点之间没有顺序关系(也叫做自由树) 森林 由m(m >= 0)棵互不相交的数组成的集合...

数据结构-队列

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 队列(Queue) 队列是一种特殊的线性表,只能在数据的头尾两端进行操作 队列的接口设计 /* * 方法 */ // 元素的数量 int size() // 是否为空 Bool isEmpty() // 入队 void enQueue(T element) // 出队 T deQueue() // 获取队列的头...

数据结构-栈

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 栈(Stack) 栈是一种特殊的线性表,只能在数据的一端进行操作 接口设计 /* * 方法 */ // 元素的数量 int size() // 是否为空 Bool isEmpty() // 入栈 void push(T element) // 出栈 T pop() // 获取栈顶元素 T top() 实...

数据结构-双向链表

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 链表 在前篇描述了数据结构-单向链表的结构,以及常见的一些操作、算法等;本文就描述一下双向链表 使用双向链表可以提升链表的综合性能,比如要查找双向链表的尾节点时可以直接通过last去找到了,而单向链表只能依次通过next去查找 双向链表 - node方法 由于双向链表可以通过前一个节点找到前一个元素,...

数据结构-单向链表

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 链表 在前篇描述了动态数组,但动态数组有个明显的缺点: 可能会造成内存空间的大量浪费(因为一开始申请动态数组的时候,就在内存当中开辟了固定长度的空间,而且每次删除等还会对动态数组当中的元素内存进行移位) 有没一种数据结构可以使用多少就申请多少内存呢? 链表就可以办到,链表分为单向链表和双向链表, 单向链表指的是只能...

数据结构-动态数组

数据结构是计算机存储、组织数据的方式 本文演示代码为Swift语言 数据结构 数据结构分为: 在实际开发中,根据使用场景来选择最合适的数据结构 动态数组 线性表是具有n个相同类型元素的有限序列(n>=0)。举个明显的例子:数组 数组是一种顺序存储的线性表,所有元素的内存地址是连续的 比如我们创建一个局部变量的array数组:let array = [1, 2, ...

算法-复杂度

算法是用于解决特定问题的一系列执行步骤,良好的算法可以为程序节省很多性能开销 本文演示代码为Swift语言 斐波那契数(fibonacci number) 求第n个斐波那契数 斐波那契数是后面的数字为前面两个数字的和 比如0 1 1 2 3 5 8 13 …就是斐波那契数列 // 使用递归的算法计算斐波那契数 func fib(n: Int) -> Int { ...