摘要:
最近因为辞职,有不少闲功夫,重温下数据结构,顺便练练手。今天说说最短路径搜索算法中的Dijkstra原理和实现。一:简介 这个算法用于解决图中单源最短路径问题。所谓单源节点是指给定源节点,求图中其它节点到此源节点的最短路径。如下图所示:给定源节点a,求节点b到a的最短距离。(图来自于参考资料2)那么如何寻找?还是以上图为例:1)初始化:设定除源节点以外的其它所有节点到源节点的距离为INFINITE(一个很大的数),且这些节点都没被处理过。2)从源节点出发,更新相邻节点(图中为2,3,6)到源节点的距离。然后在所有节点中选择一个最段距离的点作为当前节点。3)标记当前节点为done(表示已经... 阅读全文
随笔分类 - 数据结构与算法
排序算法(二)
2012-12-08 13:49 by 钱吉, 209 阅读, 收藏,
摘要:
前面讲了冒泡排序和插入排序,今天讲的排序算法是shell排序shell排序命名来自于Donald Shell,该算法被证明为有亚二次时间界。是插入排序的一种改进,舍弃了插入排序逐一比较的不足之处,而是设定一个增量,间隔比较。然后逐渐缩小这个增量,最终达到排序目的,所以shell排序也叫缩减增量排序。首先,需要设定一组增量序列,h1,h2,...hk。然后先从h1开始,以此增量为步长,将全部序列分成若干组,每一组进行插入排序。接着增量变为h2,继续分组,然后再插入排序,这样直到最后。不同的增量序列带来的计算量不一样,本文以shell建议的增量序列为例进行算法说明,即h1=N/2,hk=hk-1/ 阅读全文
排序算法(三)
2012-12-08 13:49 by 钱吉, 256 阅读, 收藏,
摘要:
前面介绍的冒泡排序,插入排序,shell排序都是基于两两元素比较,然后移动的排序算法,有着O(N2)的复杂度,今天讲三种比较牛的排序算法,可以将复杂度降低为O(n*lgn)。分别是:1) 堆排序。2)归并排序。3)快速排序。1、堆排序算法:利用二叉堆(binary heap)的数据结构形式,及其性质对数据进行排序。首先看下什么是二叉堆,wiki解释:二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点 阅读全文
排序算法(四)
2012-12-08 13:49 by 钱吉, 270 阅读, 收藏,
摘要:
今天讲两种比较诡异的排序算法,之所以诡异是因为这两种排序算法与之前介绍的几种不太一样(见排序算法前三篇)。之前的排序算法都是基于元素比较来得到的,它们中间,像堆排序,快排等都有着比较理想的时间复杂度下界O(nlgn)。那么有没有更快的排序算法?有!下面的这两种排序算法的最好时间复杂度是O(n)。是不是很诱惑?一起来看看。1)桶排序桶排序实际上是先定义m个单元,每个单元满足一定的条件并按顺序排列,然后将所有的数据根据一种映射法则,分配到相应的单元内。然后对每个单元进行排序,最后汇总。说的很抽象,下面举个例子说明:假设现在要统计一个学院的期末考试成绩,共有1000个学生。每个学生的成绩是0-100 阅读全文
排序算法(一)
2012-12-08 13:47 by 钱吉, 292 阅读, 收藏,
摘要:
整理一下比较主流的几种排序算法,这篇介绍的排序算法有:1) 冒泡排序,2) 插入排序。一:冒泡排序这已经成为了教科书式的排序算法了。很容易实现,且对部分已经排好序的数据进行排序时,具有比较好的效率。它的最坏情形是O(N2)。算法思路:以从小到大排序为例,每次从数组最后一个元素开始,比较相邻的两个元素,如果array[j]<array[j-1],即后面的元素小于前面的元素,那么交换两者的顺序,然后j--,再比较j和j-1位置上的元素,直到最后,这样最小的元素就移动到了数组的前面。好比是将数组中的元素看成是不同重量的气泡,放在水中它们会自动在重力作用下,轻的上漂,重的下沉。这也是冒泡排序的原 阅读全文