算法
WaterWin
这个作者很懒,什么都没留下…
展开
-
算法导论——归并排序
归并排序的步骤分为三个:将问题分解为更小的问题,然后解决小问题,将小问题合并为大问题的解。针对归并排序的主要思想是:将一个需要排序的数组一分为二,然后将这两部分进行单独排序,然后将这两个排好序的子数组合然后按照顺序合并为大数组。还有一个就是边界问题,将数组无限的分下去知道最后的子数组只剩一个元素的时候也就是终止的时候,因为一个元素的数组,我们认为它就是排好序的。下面是C++的实现代码:归并...原创 2018-11-09 10:37:50 · 344 阅读 · 0 评论 -
算法导论——最大子数组
问题描述:给定一个数组,总数组中找出一个子数组使得这个子数组中的元素的和最大。思路:将数组进行分解成两个子数组,那么数组的最大子数组可能有三种情况。第一,完全位于左子数组中;第二,完全位于右子数组中;第三,跨越两个数组。然后取这三种子数组的最大值的子数组就是数组的最大子数组了。最后涉及到分解的截止条件,当子数组中的元素只有一个的时候,那么这个子数组本身就是最大子数组了。下面是C++的实现...原创 2018-11-09 14:41:44 · 1974 阅读 · 0 评论 -
算法导论——矩阵相乘(一)
矩阵的相乘,这个计算方法就直接看下面的源码实现:void mul_array(int a_array[][ARRAY_SIZE], int b_array[][ARRAY_SIZE], int c_array[][ARRAY_SIZE], int size){ for(int i = 0; i < size; i++){ for(int j = 0; j &l...原创 2018-11-09 16:14:10 · 679 阅读 · 0 评论 -
算法导论——堆排序
首先讲一下堆这个数据结构的特征:堆是一个数组,可以看成是一个近似的完全二叉树,一个索引从零的数组,其父节点与子节点的索引存在下面的关系:int parent(int child){ return (child - 1) / 2;}int left_child(int parent){ return parent * 2 + 1;}int right_child(i...原创 2018-11-09 20:46:50 · 297 阅读 · 0 评论 -
算法导论——二叉搜索树
二叉搜索树是以一个二叉树来组织的,树的每个节点都是由键值value,父节点parent,左子节点left_child,右子节点right_child组成的,而且二叉搜索树的节点间满足以下的关系:假设x是二叉搜索树中的一个节点,如果y是x左子树中的一个节点,那么y的value是比x的value小;如果y是x右子树中的一个节点,那么y的value不比x的value小。二叉树支持的操作有:遍历、查找...原创 2018-11-13 16:18:10 · 288 阅读 · 0 评论 -
算法导论——红黑树
红黑树是二叉搜索树的一种特例,它对每个节点增加了一个颜色的属性,通过增加以下的条件使得这颗二叉树更加平衡:1.每个节点或是红色的,或是黑色的。2.根节点是黑色的。3.每个叶节点是黑色的。4.如果一个节点是红色的,那么它的两个子节点都是黑色的。5.对每个节点,从该节点到其所有后代节点的简单路径上,均包含相同数目的黑色节点。红黑树的插入和删除如果按照二叉树的处理,那么它的性质可能被破坏,那...原创 2018-11-15 20:23:26 · 553 阅读 · 0 评论 -
优先队列
堆这样的数据结构经常用到优先队列中,下面关于优先队列还是以最大优先队列作为例子,一个放最大优先队列应该支持一下的操作:1.INSERT(S,x),把元素x插入集合S中。2.MAXIMUM(S),返回S中具有最大键值的元素。3.EXTRACT-MAX(S):去掉并返回S中的具有最大键值的元素、4.INCREASE-KEY(S,x,k):将元素x的键值增加到k,这里k不小于x。看一...原创 2018-11-12 16:20:00 · 534 阅读 · 0 评论 -
快速排序
快速排序跟归并排序是一样的,采用的是分治的思想。其实现是每次将数组分为两个部分,一部分小于某个值,一部分大于某个值。当这样一直拆分下去,最后归并就得到一个排序好的数组。下面来看一下C++实现,partition函数是将一个数组的一部分,拆分为两半的过程,选取了数组这部分的最后一个元素,然后将小于这个元素的移到这部分靠前部分,大于这个值的移到靠后部分,最后有一个这个值的位置,这样就确定了这个值的...原创 2018-11-12 16:55:59 · 145 阅读 · 0 评论 -
计数排序
之前的排序算法都是基于比较的基础上进行排序的。计数排序是假设输入的元素的每一个都是在[0,k]之前的一个整数。排序的基本思想就是对每个输入的元素,统计小于这个元素的数量,下面是具体的C++的实现:首先将统计的数组全部置零,然后根据输入来统计每个输入的相同的元素出现的次数,接着根据这个个数我们算出每种相同的元素应该放置的范围,那么元素值s应该放置的范围就是[counting_array[s - ...原创 2018-11-12 17:32:37 · 163 阅读 · 0 评论