
算法
SwiftLess
北大青鸟博士毕业,欢迎一起交流。
展开
-
冒泡排序
一、基本思路冒泡排序的基本思想其实非常简单:给一个长度为 N 的数组由小到大排序 ,将这个数组的元素两两进行比较,如果左边的比右边的元素大,那么就交换它们的位置。经过一轮这样的比较,就把数组中最大的数放到了数组最右的位置。同理,接下来再把除了最后一个元素以外的数组元素进行一次这样的比较,就能把第二大的数放在倒数第二的位置。经过 N 轮这样的比较,这个数组就是有序的了。下面用一组图来描述一下一...原创 2019-09-10 21:59:31 · 173 阅读 · 0 评论 -
插入排序
一、基本思路插入排序的基本思路也比较简单:把一个长度为 N 的数组由小到大排序,假定有一个已经有序的序列,然后把数组中的元素逐个插入到这个有序序列中。那么具体要如何实现呢?假如我们有一个数组:4, 1, 6, 5, 2, 3,它的长度为 6。我们把数组第一个元素看成是有序序列,那么接下来的工作就是要把第二个到最后一个元素插入到这个有序序列中。因为前面一段已经是一个有序序列了,因此对于后一段...原创 2019-09-11 11:42:49 · 168 阅读 · 0 评论 -
归并排序
一、基本思路对于归并排序,我个人是这样理解的:对于一个长度为 N 的数组,把它分成两个长度为 N/2 的子数组,分别排序,再把这两个数组进行合并。同样,对于这个两个子数组,又可以把他们进一步分成两个子数组,排序,合并。一直这样划分,等子数组的长度为 1 时,就无法再划分,之后便是合并的过程。很明显,这是一种“分而治之”的思想,我记得在学分治法的时候,归并排序就是一个非常基本的例子。这样看起来...原创 2019-09-12 20:23:53 · 154 阅读 · 0 评论 -
快速排序
一、基本思路给定一个长度为 N 的数组,使用快速排序由小到大进行排序:选择数组中的某个元素作为“标尺”,把这个数组分成三部分。把小于该元素的数全部放到它的左边,大于它的数则放到他的右边,等于它的数放在中间,然后再对左右两边的元素进行同样的操作。下面用一组图片来解释一下:初始状态下,小于区域和大于区域都为空。假设我们选取数组的最后一个元素作为“标尺”。我们把数组的第一个元素(4)和标尺(3...原创 2019-09-12 22:28:05 · 399 阅读 · 0 评论 -
堆排序
一、背景知识堆:堆是一颗完全二叉树;堆中某个节点的值总是不大于或不小于其父节点的值。用宽度优先遍历的方法,将一个堆保存在数组中,如下:对于第 i 个节点(数组中的第 i 个元素, i 从0开始),如果它的左右子节点和父节点都存在,那么它们在数组中的位置:Indexlchild = 2 * i + 1Indexrchild = 2 * i + 2Indexparent = (i - ...原创 2019-09-13 17:26:09 · 242 阅读 · 0 评论