Haley-Wong

Write the code, Change my world.

算法之路---快速排序

快速排序是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序应该是应用最广泛的排序算法了。因为它实现简单,使用于各种不同的输入数据且在...

算法之路---归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。分治法就是将一个大问题分解成小问题然后递归求解,然后再将小问题的结果合并,最终得到问题的解。 归并操作 归并操作,也叫归并算法,指的是将两个有序的序列合并成一个有序的序列的方法。 算法描述 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个有序序列之和,该空间用来存放合并后的序列。 第...

算法之路---堆排序

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 而堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 同时,我们对堆中的结点从上之下,从左至右进行编号,将这种逻辑结构映射到数组中就是下面这个样子:...

算法之路---希尔排序

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。...

算法之路---排序算法(简单排序)

排序算法在各种语言中都有已经封装好的API可使用了。但是排序算法内部怎么实现的?有哪些常用的排序算法我们还是需要了解一下的。 排序的稳定性 假设Ki = Kj(1≤ i ≤ n, 1≤ j ≤ n),且在排序前的序列中ri领先于rj(即i < j)。如果排序后ri仍领先于rj,则称所用的排序算法是稳定的;反之,若使得排序后的序列中r仍领先于ri,则称使用的排序算法是不稳定的。 简...

iOS中的KVO底层实现

KVO是Key-Value-Observer的缩写,使用的是观察者模式。底层实现机制都是isa-swizzing,就是在底层调用object_setClass函数,将对象的isa指向的Class偷偷换掉。 而观察者模式就是 目标对象(被观察的对象)管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。而主动通知观察者对象这个实现一般都是调用观察者对象提供的接口。这样就可以...

iOS导航栏控制Tips

许久不写UI,对UI的很多东西都生疏了,最近使用导航栏的各种场景做一些总结。 1.导航栏的显示与隐藏 导航栏的显示与隐藏,分两种情况: 1.从不显示导航栏的页面push到显示导航栏的页面。 2.从显示导航栏的页面Push到不显示导航栏的页面。 注意: 1.如果导航栏不显示时,系统的侧滑返回功能无效。 2.虽然侧滑返回功能无效,但是导航栏的 .interactiveP...

iOS 中获取某个视图的截图

最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。 第一种情形截图 这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用。 源码: /** 普通的截图 该API仅可以在未使用layer和OpenGL渲染的视图上使用 @return 截取的图片 */ - (U...

算法之路---汉诺塔(又称河内之塔)

汉诺塔是很简单也很经典的算法之一。 汉诺塔是根据一个传说形成的数学问题: 有三根杆子A,B,C 。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 1 每次只能移动一个圆盘; 2 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可以将A杆移除的圆盘重新移动回A杆,但都必须遵循上述两条规则。 问:如何移?最少要移动多...

RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系

如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD、Autorelease Pool有没有关系,哪些地方用到了GCD、Autorelease Pool等。 So,本文就总结一下RunLoop与GCD和 Autorelease Pool 之间的关系,看看在RunLoop实现中,哪些地方间接或者直接使用、操作到了GCD 和Autorelease Pool。 Ru...

RunLoop总结:RunLoop基础知识

没有实际应用场景,很难理解一些抽象空洞的东西,所以前面几篇文章先介绍了RunLoop的几个使用场景。 另外AsyncDisplayKit中也有大量使用RunLoop的示例。 关于实际的使用RunLoop 的案例和使用场景就不总结了,今天总结一点RunLoop的基础知识和概念。 什么是RunLoop? 顾名思义,它就是一个运行循环。一个RunLoop 就是一个用于处理既定工作和接收到的外...

RunLoop总结:RunLoop的应用场景(四)App卡顿监测

今天要介绍的RunLoop使用场景很有意思,在做长期项目,需要跟踪解决用户问题非常有用。 使用RunLoop 监测主线程的卡顿,并将卡顿时的线程堆栈信息保存下来,下次上传到服务器。 参考资料 关于今天要介绍的使用RunLoop 监测主线程卡顿的资料如下: 微信iOS卡顿监控系统 (这篇文章要首先阅读,了解有哪些情况会引起主线程卡顿,监测到卡顿后怎么处理等) 监控卡顿的方法 (...

Xcode 调试技巧 --常用命令和断点

Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令。而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧。 调试命令 在上图中,右侧绿色区域就是Log 输出区,在 Log 输出区可以使用一些命令,来辅助调试。 那有哪些调试命令呢? 想要看所有的调试命令,可以在上图的右侧区域输入help,就...

RunLoop总结:RunLoop的应用场景(五)阻止App崩溃一次

今天要介绍的RunLoop应用场景感觉很酷炫,我们可能不常用到,但是对于做Crash 收集的 SDK可能会用得比较频繁吧。相比关于RunLoop 可以让应用起死回生,大家都听说过,可是怎么实现呢?今天我就来实际试验一下。 资料 sunnyxx线下分享RunLoop (这是一份关于线下分享与讨论RunLoop的视频,备用地址:https://pan.baidu.com/s/1pLm4...

RunLoop总结:RunLoop的应用场景(三)滚动视图流畅性优化

今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少。因为跟UITableView、UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView、UICollectionView等视图滑动流畅的因素。 参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看。我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,...