
算法
牛麦康纳
主攻运维安全基础平台架构设计与落地
展开
-
快速排序详解与实现
选一个序列中的值,所有元素跟这个值做比较,序列被分为两部分,然后对剩下每部分继续做相同操作。 快排随机性很大,跟选取的值有关系,每次选值有可能将序列平均分为两份,也有可能做了无用功选取了最大或者最小的那个值,所以时间消耗上随机性很大.原创 2017-12-09 12:49:54 · 385 阅读 · 0 评论 -
冒泡排序
序列中相连的元素从左到右两两做比对和位移,[0,1]、[1,2]、[2,3]……[n-1,n],比对完一轮后最大的(或最小的)就落到了队尾,对剩下的n-1个元素继续做相同操作,直到结束。 每次比对关注的值越来越大,最终露出水面,所以很形象的称为冒泡排序。 时间复杂度方面,冒泡复杂而且稳定,不会因数据的随机性而变化,比对次数=(n-1)+(n-2)+…+(n-n+1)=(n^2)/2-n/2,所以复杂度O(n^2) 稳定性方面我们可以控制冒泡的规则,不打破相等数值原来的相对位置,所以是稳定的. 空间复杂度原创 2017-12-08 19:19:23 · 245 阅读 · 0 评论 -
简单选择排序和二元选择排序
简单选择排序在整个数组中选取最小值替换队首,再对剩下的n-1个元素选取最小值,依此类推直至结束。 二元选择是对简单排序的优化,每次选取最小最大两个极限值分别放在队首和队尾的位置,整个序列两头有序中间无序。二元选择减少了对无序部分的便利次数,复杂度和稳定性跟简单选择排序一样.原创 2017-12-07 22:55:58 · 620 阅读 · 0 评论 -
希尔插入排序:
按一定跨度d两两进行比对并按序交换位置,进行完一轮比对后跨度缩小再进行下一轮,经过几轮后先将整个序列变成部分有序,然后再进行直接插入排序,减少直接插入排序的开销。 希尔算法涉及到2个概念,跨度和深度,跨度一般我们选取总长度n的一半,下一轮再减半,也就是[n/2,n/4,n/8,…],深度根据序列元素的大小自己设置,深度越深希尔算法消耗越大,但是希尔后的列表越趋近有序,直接查插入时消耗越小,极限情况下希尔排序后序列已经完全有序,直接插入消耗约等于零。原创 2017-12-07 22:28:20 · 631 阅读 · 0 评论 -
直接插入排序
从第一个元素开始,被认为是一个有序的序列,剩下的元素按位置顺序逐一与前面的有序序列进行比对并按序插入到序列中。这样序列首部从小大到序列在增长,序列尾部无序的部分在削减,直到最尾部一个元素比对结束后,整个序列变成有序。原创 2017-12-07 22:07:45 · 238 阅读 · 0 评论 -
排序算法的详解与总结
1 凡是不需要创建临时控件,通过指针变动位置互换就可以完成的排序,空间复杂度最低,只有O(1) 2 凡是按照固定的套路元素两两比较直到结束的,时间复杂度最高,是O(n^2),像冒泡排序、简单选择排序就属于这种排序。 3 选择排序方法第一优先是业务,也就是稳定性;第二优时间复杂度不能太差,剩下的取时间和空间的平衡。原创 2017-12-11 18:08:01 · 453 阅读 · 0 评论 -
基数排序
该算法不仅使用在数字排序上,多维度元素的排序只要合理的建模都可以用基数排序,例如扑克牌中花色代表一个维度,个位数代表一个维度,十位数代表一个维度,十位相等比个位;个位相等比花色。原创 2017-12-11 17:59:29 · 335 阅读 · 0 评论 -
堆排序
将所有序列构建成一个完全二叉树,然后将完全二叉树构造成大堆顶或者小堆顶。以小堆顶为例,要求二叉树中所有节点必须小于自己的左右两个叶子节点,用数学公式表达就是:k(n)<=k(2n+1) && k(n)<=k(2n+2) 当一轮堆排序完成后,堆顶就是该序列最小值。此时将堆顶元素取走,对剩下的n-1个元素再做一轮堆排序,直到全部元素从堆顶吐出。 小堆顶取值,则整个序列是倒序排列;大堆顶取值,则整个序列是正序排列。 核心问题有2个,第一:如何对无序的堆进行排序;第二:吐出堆顶后二叉树被破坏,如果重新构建这个二原创 2017-12-10 22:51:09 · 483 阅读 · 0 评论 -
归并排序
相邻两个元素二二合并形成一个小序列进行比较,合并一轮后再两个子序列二二合并形成更大的子序列进行排序,中间过程中遇到单个的子序列则等到下一个合并周期,直到所有序列合并成一个总序列,排序后结束。原创 2017-12-09 19:12:29 · 254 阅读 · 0 评论 -
熵
本文主要介绍了信息量、熵、相对熵、交叉熵这4个概念原创 2018-02-12 16:01:03 · 1438 阅读 · 0 评论