数据结构与算法Java实现
文章平均质量分 72
rhwayfunn
这个作者很懒,什么都没留下…
展开
-
常用内部排序算法之一:归并排序
前言 归并排序是所有常用内部排序算法中稳定性最好的,无论是平均时间复杂度、最坏时间复杂度还是最好时间复杂度,其时间复杂度都是O(nlogn)。由于这个特性,在需要考虑排序稳定性的情况下,归并排序是所有优化算法(直接插入排序、冒泡排序和简单选择排序)使用最多的。其实归并排序算法的思想很简单:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每一个子序列的长度都是1,然后把这些子序列两两归并,得原创 2015-11-30 22:06:26 · 1228 阅读 · 0 评论 -
二叉树遍历算法之一:前序遍历
递归实现前序遍历二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次。当调用遍历算法的时候前序遍历的具体过程如下:首先访问根节点,如果根节点不为空,执行输出语句,打印根节点的值。如果左子树不为空,则访问根节点的左孩子,并输出根节点做孩子的值继续访问根节点的左孩子的左孩子,如果不为空则继续输出该左孩子的值;如果这时左孩子为空,原创 2015-12-07 20:14:26 · 1746 阅读 · 0 评论 -
二叉树遍历算法之二:中序遍历
中序遍历的递归实现中序遍历遍历指的是先访问二叉树中节点的左孩子,再访问当前节点,最后再访问其右孩子。具体访问步骤如下:首先访问根节点,判断根节点是否有左孩子,如果有,进行第二步;如果没有,跳到第三步;访问左孩子,继续判断当前节点是否有左孩子,如果有则继续访问其左孩子,直到某节点的左孩子为空判断是否有右孩子,如果有,则继续判断当前节点是否有左孩子,一直到某节点没有左孩子为止把第二步访问的节点做原创 2015-12-08 15:25:42 · 1268 阅读 · 0 评论 -
二叉树遍历算法之三:后序遍历
后续遍历的递归实现后续遍历指的是先访问节点的左右孩子,最后访问节点本身。所以使用后序遍历得到的结果的最后一个节点就是根节点。采用后续遍历的具体步骤如下:先访问根节点,如果有左孩子,进入第二步;如果有右孩子,进入第三步对左孩子继续判断其是否有左孩子,直到某节点的左孩子为空,设为cur节点对右孩子继续判其是否有左孩子,直到某个节点的左孩子为空,设为curR节点cur节点访问之后,访问其双亲节点的原创 2015-12-08 17:11:03 · 14829 阅读 · 2 评论 -
图的深度优先遍历算法
前言图的遍历与前面文章中的二叉树遍历还是存在很大区别的。所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次。由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的。因为对于任意一个顶点来讲,都可能与其余的顶点发生连接。如果不对访问的顶点做一些处理,出发重复访问的几率是很高的。因此,一个基本思想是设置一个标记数组,主要用于标记已经被访问过的顶点。图的原创 2015-12-22 23:34:37 · 8944 阅读 · 1 评论 -
图的广度优先遍历算法
前言广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走;而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的时候则是合二为一(好吧,有点扯了)。广度优先遍历算法的遍历过程仍然以原创 2015-12-23 17:17:45 · 3774 阅读 · 0 评论 -
常用内部排序算法之五:希尔排序
前言在前面介绍常用内部排序算法的文章中,我们知道在简单排序算法中,直接插入排序算法的时间复杂度是要优于冒泡排序和简单选择排序的。而这里要讲的希尔排序则是优于直接插入排序的。而且希尔排序打破了原来简单排序中时间复杂度不能超过O(n2)O(n^2)的神话。这也是希尔排序伟大的地方,而且希尔排序不同于之前三种简单排序,希尔排序是以一个科学家的名字进行命名的。希尔排序的原理由于希尔排序是在直接插入排序的基础原创 2015-12-05 19:07:07 · 817 阅读 · 0 评论 -
二分查找算法及其变种
前言二分查找算法也称为折半查找算法,是一种在查找算法中普遍使用的算法。其算法的基本思想是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功;若给定的值小于中间记录的关键字,则在中间记录的左半区间继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区间继续查找;不断重复这个过程,直到查找成功。否则查找失败。这个思想与孔子中的中庸思想和相似。二分查找算法的实现基于原创 2015-12-06 16:43:23 · 4346 阅读 · 0 评论 -
常用内部排序算法之四:简单选择排序、直接插入排序和冒泡排序
前言之所以把这三类算法放在一块,是因为除此之外的算法都是在这三类算法的基础上进行优化的。简单选择排序的思想是每一趟n−i+1(i=1,2,...,n−1)n-i+1(i=1,2,...,n-1)个记录中选择最小的记录作为有序序列的第ii个记录。直接插入排序的思想是将一个记录插入到已经排好序的有序序列中,从而得到一个新的、记录数增加1的有序表。冒泡排序的算法思想是不断在交换,通过交换完成最终的排序,每原创 2015-12-03 14:54:37 · 2286 阅读 · 1 评论 -
常用内部排序算法之三:堆排序
前言堆排序是以堆为原型的排序。堆首先是一棵二叉树,具有以下两个性质:每个节点的值大于或者等于其左右孩子结点的值,称为大顶堆;或者每个节点的值都小于或者等于其左右孩子结点的值,称为小顶堆。从这个定义中可以发现,堆得根节点要么是最大值要么是最小值。实现堆排序的基本思想是:将待排序的序列构造成一个大顶堆或者小顶堆。此时整个堆满足根节点是最大值或者最小值。将根节点移走,并与堆数组的最后一个值进行交换,这样的原创 2015-12-02 19:00:09 · 942 阅读 · 0 评论 -
常用内部排序算法之二:快速排序
前言快速排序可以说是内部排序算法中的高手,之所以称为快速排序,是因为快速排序算法从整体性能上讲是排序冠军。快速排序算法的思想是:通过一趟快速排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的记录的关键字小,则可分别对这两部分记录继续进行排序,达到整个记录有序。实现快速排序算法的核心是partition函数,这个函数的主要目的先选取当中的一个关键字(称为枢轴),然后尽可能将他放原创 2015-12-01 20:51:11 · 1453 阅读 · 0 评论 -
数据结构基础
在Java研发工程师招聘中,数据结构与算法是必考的题目,不久看到一篇文章《为什么面试总喜欢考算法题》提到:面试考算法是一个基准点,因为算法是计算机学科中最基础的学科。本着不死也脱层皮的想法就买了本算法书开始啃,虽然其中很多题目我就是想破脑汁也想出来,可我居然能沉浸在这样的状态中自得其乐。“算法虐我千百遍,我仍待它如初恋”。 顺序存储结构顺序存储结构数据存在内存地址连续的一块区域,数组便是这种存储结原创 2016-03-29 09:48:02 · 1154 阅读 · 0 评论