数据结构与算法
臭脚大仙
不忘初期
展开
-
算法笔记五:利用堆结构来对数据进行排序
算法思想: //将数组build成最大堆格式,这样,数组的第一个元素一定是最大的 //有了这个前提,就可以从后往前迭代:将最后一个元素与第一个元素交换,这样最大值就排到了最后面 //然后对第一个元素开头的堆结构进行重建堆,使其依然满足第一个元素为最大的元素 //关键就在于建堆的逻辑 //堆数据结构:给定一个节点的下标i,其左子节点的位置为2*i+1(i右移一位+1),右子原创 2014-10-17 17:34:56 · 635 阅读 · 0 评论 -
算法笔记四:使用分治策略求最大子数组算法
算法思想: //求最大子数组问题:给定一个数组,求出值相加起来的最大的子数组 //当数组中全部是正数时,数组本身就是其最大子数组 //采取分治策略来解答,将数组一分为二,那么,答案要么位于左侧,要么位于右侧,要么横跨分割点。 //横跨分割点时,其解答的代价是线性的 //左侧和右侧又可以采用递归方式继续求解 //不难得出,代价为O(NlgN) //跟传统的依次求每种可能的代价O(n^2原创 2014-10-17 17:21:48 · 781 阅读 · 0 评论 -
算法笔记七:计数排序
算法思想: //前提条件: //待排序集合均为正整数 //已知其最大值(也可以排序的过程中求出) //思想:假设我知道给定一个数,其前面有N个数比我小,那么,我就知道我应该位于数组中的第几个位置上 //实现方式:对于带排序集合中的每一个数,使用其值作为在另外一个数组中的下标,并将目标数组的值加1,这样,目标数组就记录了待排序集合中的每个元素所出现的次数 //该目标数组称原创 2014-10-20 11:17:20 · 539 阅读 · 0 评论 -
算法笔记三:归并排序
算法思想: 将一个大的规模的数据,一分为二,分成两部分,分别对这两部分执行排序,然后将两个已经排好序的部分,执行归并操作。 分解—>解决—>合并 在解决的步骤中,什么条件下是阻止其继续分解的终止阀呢?: 1、分解的只有一个元素了 2、分解到了一定小的规模,采用其他算法,如插入算法来解决排序问题 最好情况: 与最坏情况相同,都是O(n*log2n) 最坏情况: 与最原创 2014-10-17 16:23:56 · 599 阅读 · 1 评论 -
算法笔记二:插入排序
算法思想: 开辟另一个新空间,将待排中的n个元素,依次取出,插入到新空间的正确位置。 确定插入的位置:从队尾往队首依次比较,直到发现某个元素A比当前待插入元素B要小时,则B需要插入到A的后面 执行插入:将A后面的所有元素,往后移动一位,这样,A元素后面的这个位置就空闲出来,供B插入 思路举例:玩扑克牌,抓牌,插入手中已有牌的某个正确位置 最好情况: 如果待排序的数组是和期望的排原创 2014-10-17 16:19:21 · 433 阅读 · 0 评论 -
算法笔记八:基数排序
思路: 按照个位—>十位->百位这个位数,从低位到高位,依次对待排序数组执行排序,直到最后一位,排出来的结果集就是已完成排序的结果: 比如:有三个数字:235,786,241 先按照个位来排: 241,235,786 再按照10位来排: 235,241,786 再按照百位来排: 235,241,786 最终结果:正确!#ifndef __p1__BaseNumberSort__原创 2014-10-20 22:07:31 · 564 阅读 · 1 评论 -
算法笔记一:概述
分析一个算法,主要是考量它的运行的时间代价和空间代价,而在评估时间代价时,还要分析下最好情况下的代价和最坏情况下的代价。 最好情况,用来分析该算法的最佳应用场景 最坏情况,用来确定该算法的最长执行时间的上限 某些算法可能会更加的关注于平均情况,当平均情况趋向于较好情况时,是有意义的,这里就需要对其平均情况发生的概率,进行分析,但大多数算法,其平均情况基本与最坏情况相当原创 2014-10-17 16:18:53 · 385 阅读 · 0 评论 -
算法笔记十:计算第I大的数
计算第I大的元素 一般的思路是,把所有的数据都排好序,然后就可以求出第I大的数,但是其实这是一种浪费,因为我们只是为了得到第I大的元素,并不需要将数据排序 这里采用的方法就是,随机从集合中取出一个树,保证其左边的数都比它小,右边都比它大,这样就计算出当前位置为其应该出现在已排好序的数组中的位置(还记得快速排序吗?) 根据这个应该出现的位置K,去跟I做比较,如果等于I,则得出结果,否则去其左边原创 2014-11-18 21:46:25 · 681 阅读 · 0 评论 -
算法笔记九:桶排序
思路: 假设待排序的数据集,平均的分散在各个区间里(最理想的状态是每个区间有且只有一个元素), 那么我只要将每个数据落入到响应的区间里,然后从小到大依次从区间中取出数据,即是已排序好的结果 这里的区间,其实就是桶的概念 空间代价: 取决于放入桶中的元素的数据结构,我这里采用的是一个指向下一个元素的指针以及当前int元素, 基本可以人物空间代价为O(n原创 2014-10-31 16:53:07 · 436 阅读 · 0 评论 -
算法笔记六:使用分治策略执行快速排序
算法思想: //采用分治策略,将原数组,分解为三部分:左边的 + 已最终定位的节点位置 + 右边的 //分解:取任意一个位置的数,将数组划分为3部分:左边+该数的最终位置+右边,继续对左右两边递归执行分解操作 //解决:求出给定位置数的最终位置,即保证左边都比它小,右边都比它大 //合并:在分解的过程中,就已经将元素的最终位置给计算好了,不需要任何操作 分原创 2014-10-17 17:41:56 · 593 阅读 · 0 评论 -
算法笔记十一:二叉树之搜索二叉树
二叉树: 每个节点,除了key之外,还有3个属性:父亲、左孩子、右孩子,其中,父亲一定大于左孩子,一定小于(等于)右孩子 搜索二叉树: 利用二叉树的这些性质,我们可以得出,在这样一个结构下,插入、删除、查找的步骤,最多不会超过树的高度。注意哈,这里的二叉树,并不是平衡的,所以,其树的高度并不等于lgN,所以,最坏情况下,这个树的插入、查找、删除的最差性能,等于树的节点树N,跟链表的性能相等原创 2014-12-12 22:37:19 · 515 阅读 · 0 评论