算法相关GitHub持续更新,欢迎打脸~
算法是从事程序开发人员永远绕不过去的一道门。虽然很多时候我们都会说,算法这东西只有面试时会用。但很多时候,算法已经被潜移默化的影响着我们,影响着我们写程序的方式。不知你有没有这样的经历,自己辛辛苦苦写了几百行代码,终于将要实现的功能实现了,正怡然自得之时,发现别人实现这个只用了一两行代码......</br>
总之,不管你学与不学,算法就在那里!
不管你屑与不屑,面试官的考题就在那里!
既然这是个装逼利器,既然是它总在无形中改变着什么,既然我们还有时间去征服,为什么不试试呢?</br>
大学时只是形式的学,为了一个分数,认为多一分浪费;现在想想人总是那么厚颜无耻,叫你学时不学,没人管了之后却又想着把失去的补回来,多说无益,开始鞭策自己,权当从零开始。</br>
排序是《数据结构》里一个重要的一脉,从我们日常的业务处理到数据库的排序,都有对排序算法应用的淋漓尽致,接下来的几个星期,征服排序算法!</br>
知己知彼,百战不殆
我们先回顾一下几种常见的常用算法,从不同的维度比较各个算法的优劣。</br>
时间复杂度
计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。</br>
空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
排序法 | 最差时间分析 | 平均时间复杂度 | 稳定度 | 空间复杂度 | 类型 |
---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n2) | 稳定 | O(1) | 交换 |
快速排序 | O(n2) | O(n log2n) | 不稳定 | O(log2n)~O(n) | 交换 |
选择排序 | O(n2) | O(n2 ) | 稳定 | O(1) | 选择 |
堆排序 | O(n log2n) | O(n log2n) | 不稳定 | O(1) | 选择 |
插入排序 | O(n2) | O(n2) | 稳定 | O(1) | 插入 |
希尔排序 | O(n) | O(n2) | 不稳定 | O(1) | 插入 |
归并排序 | O(n log2n) | O(n log2n) | 稳定 | O(n) | 其他 |
基数/桶排序 | O(d*(r+n)) | O(d*(r+n)) | 稳定 | O(rd+n) | 分配 |
二叉树排序 | O(n2) | O(n log2n) | 不一定 | O(n) | 其他 |
<i>@author Swift</i>
<i>@date 2017-1-8</i>
网友评论