算法
文章平均质量分 56
a854702872
这个作者很懒,什么都没留下…
展开
-
排序算法之希尔排序
排序算法之希尔排序背景希尔排序是对插入排序的优化,如果一个长度为N的数组中,数值最小的元素恰好在数组最末端,则将该元素归位(假设从小到大插入排序)得移动N-1次。特点相对于插入排序是移动相邻元素,希尔排序移动的是不相邻的元素,先对数组的局部进行排序,最终借助插入排序将局部有序的数组排序中心思想使数组中任意间隔为h的元素都是有序的操作步骤先找出待排序数组的h序列,可通过h = h * 3 + 1;原创 2017-08-27 16:51:49 · 384 阅读 · 0 评论 -
有向图中有向环检测
背景假如有三个存在优先级的任务x、y及z,x要在y之前完成,y要在z之前完成,而z又要在x之前完成,那该问题一定是无解的。寻找有向图中是否存在有向环是判定一个任务优先级问题的前提边的类型从某个点开始的深度搜索过程中遇到了后向边,可作为找到有向环的标志代码实现private boolean[] onStack = new boolean[V];public void dfs(int s) {原创 2018-01-02 10:55:08 · 2538 阅读 · 0 评论 -
Java实现快速排序及三向快速排序
快速排序思想选中数组中某个元素(一般为数组首元素)为参照物,将数组中比参照物小的元素排到数组左边,比参照物大的元素排到数组右边。快速排序的操作步骤以数组a[N]的首元素a[0]为参照物,设立两个指针i、j分别指向数组下标为1和N-1的位置移动指针i,直到满足a[i] > a[0]移动指针j,直到满足a[j] < a[0]交换a[i]和a[j]继续寻找及交换满足条件的下一个a[i]和a[j]原创 2017-12-16 16:07:26 · 468 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
邻接表数组法图是点和边的集合。如下图所示:假定所有的点都是以0-N的自然数来表示,用数组a[N]索引(下标)代表所有的点,数组的元素为一个保存了与该点直接相连的所有的点的容器(Bag)。即a[N]表示所有和点N直接相连的点的集合,如下图所示: 此种对图的描述方法称为邻接表数组法。一个图(Graph)对象对外提供的API: API 含义 int V() 顶点数 int E()原创 2017-12-02 17:41:45 · 215 阅读 · 0 评论 -
索引优先队列的实现
注:此文需要对有序二叉堆、优先队列等知识有所了解,建议看完用有序二叉堆实现优先队列后再阅读此文背景普通优先队列(不带索引)只能访问有序二叉堆的根节点,而无法引用队列中的其它任何元素。特点索引优先队列中存储的元素都有对应的“索引”,通过“索引”我们可以引用该索引对应的元素。可以理解为HashMap中的key-value,key即索引,value即所对应的元素。实现要点数组T[] a存放所有的元素,数原创 2017-08-31 18:14:54 · 693 阅读 · 1 评论 -
排序算法之堆排序
注:此文需要对有序二叉堆、优先队列等知识有所了解,建议看完用有序二叉堆实现优先队列后再阅读此文和优先队列的关系因为优先队列本身已经提供了删除最小(或最大)元素的接口,最简单的做法是将待排序数组依次插入优先队列中,再依次删除最小元素。此种做法需额外的空间(优先队列),且时间复杂度较高(相当于插入排序,外循环用于便利所有待排序元素,内循环用于向优先队列insert元素)。操作步骤待排序的数组可看做一个原创 2017-09-02 15:53:38 · 199 阅读 · 0 评论 -
用有序二叉堆实现优先队列
优先队列优先队列要提供并实现两个操作删除并返回最大元素插入元素优先队列的实现优先队列的实现采用有序二叉堆形式,采用链表或堆栈也可实现,但时间复杂度较高。这里不再赘述。有序二叉堆的特点所有根结点必定不小于其两个叶子节点如果某个节点对应的数组下标为k,则其根节点为k/2,其叶子节点为2k和2k+1有序二叉堆通过数组实现,采用数组a[N+1]描述有序二叉堆中第一个到最后一个节点(数组元素a[0原创 2017-08-30 19:54:40 · 561 阅读 · 0 评论 -
Java实现二叉查找树(BST)
背景对于一个size为N的链表或有序数组来说,进行第N+1次操作时最坏情况下的增长数量级如下表: 数据结构 \ 操作 查找 插入 链表 N logN 有序数组 logN N链表的优势在于插入,有序数组的优势在于查找(二分查找),而二叉查找树综合了以上两者的优点。API 函数 描述 put(Key ke原创 2017-09-11 20:33:02 · 431 阅读 · 0 评论 -
排序算法之归并排序及利用归并排序求逆序数
排序算法之归并排序1. 自顶向下的归并排序中心思想将待排序的数组平均切分为两半,将前半部分和后半部分分别进行排序,再讲两个有序数组归并到一个数组中特点递归,需要额外的空间(辅助数组)来保存切分完成的子数组,主要难点在于合并操作步骤将待排序数组均分为两半对前半部分进行排序对后半部分进行排序合并两个子数组递归调用以上过程代码实现public void sort(int[] a){ i原创 2017-08-27 22:11:28 · 886 阅读 · 0 评论 -
无向图有环检测
问题给定一幅无向图,如何检测出其是否有环存在?//只需在深度优先搜索方法中添加几行代码即可解决public void dfs(int v, int s) {//v代表要被搜索的节点,s是v的父节点,s->v,代表指向v的一条路径, marked[v] = true; for (int w : G.adj(v)) { if (!marked[w]) {原创 2017-12-30 15:49:32 · 2002 阅读 · 0 评论