摘要:
在前面先后介绍了二叉树先序遍历的非递归算法和中序遍历的非递归算法,这里则来介绍二叉树后序遍历非递归算法,二叉树后序非递归遍历真的非常之 重要,因为它具有独特的特性(文章结尾会阐述),所以,在很多与二叉树相关的复杂算法中,经常要用到二叉树后序遍历的非递归算法。并且在互联网面试笔 试也经常考察该算法,所 阅读全文
摘要:
二叉树中序遍历的非递归算法同样可以使用栈来实现,从根结点开始,将根结点的最左结点全部压栈,当结点p不再有最左结点时,说明结点p没有左孩子,将该结点 出栈,访问结点p,然后对其右孩子做同样的处理。 二叉树中序遍历非递归算法实现如下: 阅读全文
摘要:
二叉树是一种很重要的数据结构,在互联网面试笔试中,二叉树都是考察的重点和难点。很多关于二叉树的问题都涉及到了二叉树的遍历,根据二叉树根结点被访问 的顺序,可以将二叉树的遍历分为:先序遍历(根、左、右),中序遍历(左、根、右),后序遍历(左、右、根)。二叉树遍历的算法可以采用递归来实现,也可以采用非递 阅读全文
摘要:
如果觉得前面的几种排序很简单的话,那么对于归并排序算法的实现就稍微难一点点了,我相信很多同学学完数据结构后,并不能很熟练的写出归并算法, 然而,归并排序以及归并排序的变体在互联网在线笔试题是很常见的。接下来就来学习数组的归并排序,为何要强调是数组的归并排序,因为,今天在OJ上刷题 的时候,遇到了单链 阅读全文
摘要:
堆排序是将给定的序列看成完全二叉树的顺序存储结构来进行排序。 在学习堆排序之前,先了解一下完全二叉树的一个性质: 给定一颗完全二叉树bt,采用顺序存储结构来进行存储,那么如何表示父结点与左右孩子结点之间的关系呢? 下面分两种情况: (a).如果从下标为0的位置开始存储,那么对于下标为i的结点,其左孩 阅读全文
摘要:
直接选择排序每一趟排序都会从未排序的序列中选择出最小的元素来,然后跟未排序序列的第一个元素交换。这样经过n-1趟排序后,每趟排序选择出的 最小元素便成了有序的序列。 算法实现如下: 直接选择排序的时间复杂度为O(n2),空间复杂度为O(1)。直接选择排序同样是一种不稳定的排序算法(不稳定的排序算法有 阅读全文
摘要:
快速排序同样是一种交换排序,在以往的互联网求职面试过程中,经常有面试官让手写快排的算法,这属于最基本的知识,我们一定要烂熟于心。 首先来了解一下快排是怎么一回事:假设给定了一个序列,将序列的第一个元素(或者任意元素都行)作为基准,首先从后向前扫描序列,遇到比基 准小的元素,将其交换到基准的前面;然后 阅读全文
摘要:
冒泡排序是一种交换排序,每一趟排序过程中都不断的比较相邻两个元素的大小,如果满足条件(递增或者递减),则交换相邻两个元素的位置。 冒泡排序比较简单,就不必过多阐述,代码实现如下: 冒泡排序的时间复杂度为O(n2),空间复杂度为O(1)。 阅读全文
摘要:
在直接插入排序中,需要将待排序的元素与有序区间中的元素一一比较,直到找到插入位置,因此,直接插入排序虽然简单易懂,但是效率很低, 元素比较的次数很多。为了减少元素的比较次数,我们在查找待排序元素的插入位置时,在有序区间内采用折半查找,这也就是二分插入排序的由来。 如果不明白我所说的“有序区间”是怎么 阅读全文
摘要:
所谓的排序就是给定一个序列,然后整理该序列,使其元素呈现递增(或者递减)的状态排列。 经典的排序算法包括:直接插入排序、二分插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序等。 今天来学习最简单的排序算法——直接插入排序 我们可以将给定的一个序列分为两部分,一部分是有序区间,另 阅读全文