QXSoftware


千里之行,始于足下。

Dispose 模式

.Net 中对于托管资源和非托管资源,有不同的释放策略,为了能更好地管理资源,我们需要使用 Dispose 模式。 对于托管资源,只要该资源的引用计数为 0,该资源就会被垃圾回收;而对于非托管资源,比如一个分配在 native code 中的内存,就需要主动释放了。 Dispose 模式的...

希尔排序

希尔排序是一种“加强版”的插入排序。主要思路如下: 将待排序序列分为若干个子序列,每个子序列的“步长”一致,然后对每个子序列执行插入排序 逐步缩短步长,对每个子序列执行插入排序 最后执行一次步长为 1 的子序列插入排序 希尔排序的时间复杂度按照步长的选择算法大有不同。但是合...

堆排序

堆排序利用堆的性质进行排序。堆分为大顶堆和小顶堆。以升序排序为例,堆排序的思路如下: 首先构造一个大顶堆 然后把堆顶取出,和序列最后的元素交换,然后对前面 n - 1 个元素执行堆化操作 如此往复,直到全部有序 堆排序的时间复杂度是 O(nlogn),空间复杂度是 O(1)...

快速排序

快速排序是一种分治算法 (Divide and Conquer)。主要思路如下: 从序列中挑选一个中心(Pivot) 然后开始分区(Partitioning),使得所有比中心小的元素位于中心左边,所有比中心大的元素位于中心右边,分区结束后,中心元素的位置就是最终位置 对子分区重...

插入排序

直接插入排序 直接插入排序的思路很简单,对于一个给定序列,首先将第一个元素分出来变成一个“有序”的部分,然后依次执行 n - 1 次插入,每次插入后的子序列都是有序的。 在最好的情况下(输入序列已经是排序过的),插入排序的时间复杂度是 O(n),最坏情况下插入排序的时间复杂度是 O(n2)...

归并排序

归并排序是一种分治算法 (Divide and Conquer)。主要思路如下: 将未排序的序列“分开”为 n 个子序列,每个子序列只包含 1 个元素,这时就认为每个子序列都是有序的 重复合并子序列,从而生成新的子序列,直到只剩下一个子序列,这个子序列就是有序的 在对 n 个数...

C#多线程编程

多线程编程是一个复杂并且很容易出错的事情,为了彻底弄明白多线程编程,我们必须熟知常用的系统组件(比如临界区、信号量等),以及 .Net 的常用类和编程接口。 多线程编程所需的知识点非常多,想要彻底精通非常不容易,因为这涉及到不同的操作系统使用的种类各异的同步工具。不过好在很多基本概念是相通的...

Unity3D 罕见闪退

最近项目研发很紧张,很久没时间更新博客了。期间分析了很多 Android 和 iOS 的闪退,大部分都是可以解释的,比如内存耗尽被系统杀死,以及五花八门的 native crash,但是依旧有小部分闪退无法解释。这次就分享一个 mono 的 bug 导致的闪退。 准备条件 Unity5.3...