- 博客(13)
- 收藏
- 关注
原创 图解堆排序(详细推导)
本篇介绍另一种排序算法——堆排序文章目录堆的定义与分类堆排序基本思路图解堆排序过程完整代码片段堆的定义与分类在了解堆排序之前必须了解堆排序的定义,如下:堆是具有以下性质的完全二叉树:1.每个节点的值都大于或者等于其左右孩子节点的值称为大顶堆2.每个节点的值都小于或者等于其左右孩子节点的值称为小顶堆大顶堆示意图:大顶堆特点:我们将这个二叉树映射到一个数组即int[] arr = {34,17,24,5,3}可以得出//父节点大于左右孩子节点arr[i] >=arr[2*i +
2020-06-26 16:13:48
4212
2
原创 线索化二叉树(线索化二叉树遍历方法,倒序线索化二叉树遍历结果)
本篇介绍线索化二叉树、线索化后的中序遍历以及反向输出中序遍历。注:(不管是前序遍历、中序遍历或者后序遍历,道理都是一样的,只不过顺序不一样,所以本篇的就拿中序遍历作为讲解,方便统一与理解)文章目录1.线索化二叉树1.1-什么是线索化二叉树1.2-线索化二叉树的意义1.3-线索化二叉树完整代码2.线索化后的中序遍历2.1-思路2.2-完整代码3.(拓展)利用线索化后的二叉树反向输出中序遍历3.1-思路3.2-完整代码1.线索化二叉树1.1-什么是线索化二叉树首先思考一下:我们知道,不管是二叉树的前序
2020-06-24 18:55:22
1444
原创 二叉树笔记整理(前中后序遍历)
本篇介绍另一数据结构——二叉树,以及遍历方法。文章目录1.二叉树概念2.二叉树遍历1.二叉树概念1.1 每个节点最多有两个子节点的这种形式就称为二叉树例如:1,2,3都可以称为二叉树1.2 如果二叉树所有叶子节点都在同一层,且所有节点的总数等于2^n - 1,n代表二叉树的层数,那么我们称这个二叉树为满二叉树例如:1.3 如果该二叉树所有叶子节点都在倒数第一层或者第二层,且在倒数第一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称这个二叉树为完全二叉树例如:2.二叉树
2020-06-20 20:41:46
240
原创 一种有趣的数据结构——哈希表
本篇要介绍的是一种数据结构——哈希表。首先回顾一下数组以及链表的内容,我们知道数组有一优点就是存储于数组中的元素便于查找,这跟它的连续存储密切相关。但是它的缺点也很明显,如果我们想添加或者删除一个元素可能需要大幅度的移动数组的元素,效率较低。再看看链表,我们知道链表这种数据结构的优点就是方便在其增加或者删除一个元素,但是查找效率又非常低(必须得从头节点遍历查找)。按照人们的惯性思考——是否能将这两种数据结构结合使用,来达到查询与增删效率上的“中和”呢?答案是可以的,所以就诞生了哈希表这种数据结构。那么如
2020-06-19 20:16:52
307
原创 斐波那契查找算法——深入理解,详细推导
斐波那契查找算法又称黄金分割查找算法。黄金分割点是把一条线段分成两个部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。了解斐波那契查找算法就必须了解斐波那契数列,如何这样一组数列{1,1,2,3,5,8,13,21,34,55}。其中每项的值等于前两项之和,两个相邻数字的比列无线接近与0.618。关于斐波那契算法,(以下截图来自韩顺平老师数据结构与算法的教学视频)链接补充:理解mid = low + F(k - 1) - 1对于后面写程序至关重要,其中式子F[
2020-06-18 13:47:33
2323
4
原创 查找算法之插值查找(深入理解,详细说明)
回顾一下之前讲述的二分查找。其基本的思路就是找到中间值mid将序列分成两个部分,然后判断要查找的值是在左子序列还是右子序列进而继续找到中间值再分裂。可以看到,每次分裂是将原序列分成相等的两个部分,每个子序列相对于原序列所占比也就是1/2(后面提到的所占比都是这个意思)。还是拿之前的例子作比较:思考:对于序列{5,8,34,55,66},如果想要查找‘5’这个元素,按照原先二分查找的思路,在1/2的所占比的基础上分裂,那么序列要分裂(查找)多少次呢?很明显需要2次。那么,假设我们取元素‘8’为中间值,还是查
2020-06-17 22:24:13
3855
7
原创 二分查找非递归实现(补充)
之前介绍了二分查找的递归实现,现在简单补充一下二分查找的非递归实现,顺带回忆一下思路。过程比较简单,所以直接给出完整代码: /** * * @param arr 查找数组 * @param value 查找元素 * @return 查找值的位置(下标) */ public static int binarySearch03(int[] arr,int value){ int left = 0; int right
2020-06-17 20:41:30
213
原创 程序员必会的查找算法——二分查找(折半查找)
之前的发布了许多排序算法(后面还会介绍堆排序),从今天开始学习一下查找算法。今天要分享的是每个程序员必须会的查找算法——二分查找(也称为折半查找。这里要知道二分查找需要一个前提,那就是二分查找是基于有序序列的。二分查找基本思路:每次取出序列中的中间值,将需要查找的元素与之比较。这里有三种情况。一、如果该元素比中间值小就继续向左查找。二、恰好序列中的中间值正是要查找的元素。三、如果该元素比中间值大就继续向右查找。(在向左或右查找时,又需要取出左序列或右子序列的中间值作比较,直至找到该元素)由于这
2020-06-16 21:27:38
218
原创 基数排序(桶排序)思路整理
首先了解一下什么是基数排序:基数排序是桶排序的扩展,不了解桶排序也没有关系。它是通过待排序列中每个值的各个位,将每个值按照一定规则放置“桶”中,达到排序的效果。(刚刚接触这段介绍肯定是不太懂的,定义的作用就是可是帮助我们学完基数排序回过头思考,所以不理解没关系)基数排序的基本思想:将所有待排列的数统一为相等长度的数位,数位短的在前面补0。例如:统一35,246这两个数。按照最长位统一,数位短的补0也就是035,结果就和246数位一样长了。然后再将每个数依次从最低位开始比较,比较的过程中按照一定规则放入
2020-06-15 18:36:07
635
原创 归并排序思路整理
首先介绍一下归并排序:归并排序是采用归并的思路进行排序,该算法采用经典的分治策略(把一个大问题分解为若干个小的问题进而求解的过程)。字面上看起来还是很抽象的,接下来给出归并排序的整个示意图:解释:这里的“分”和“治"的过程都是递归进行,实际上”分“过程不做任何操作,在”分“的过程中持续压栈,直到最后序列中的元素只有一个。然后再进行”治“也就是归并操作。这个部分需要在代码片段中认真体会。前面说到”分“只是在逻辑上分裂序列,实际不做任何操作。重点就在于”治“也就是归并操作。那么,如何把分裂的元素归并成一
2020-06-14 23:29:02
1409
原创 排序算法之快速排序(详细推导)
今天介绍另一种大名鼎鼎的排序算法——快速排序。见名知意,这个算法排序速度一定相当快。接下来逐步分析分析。首先了解快速排序的基本思路:1.选的中间轴Pivot2.将大于Pivot的数据放在Pivot右边3.将小于Pivot的数据放在Pivot左边4.分别对左右子序列重复上述三步操作具体过程就是:定义两个指针,left,right.分别指向数组的头和尾,一般而言,我们选择头也就是arr[0]作为我们选定的中间轴Pivot。然后从right开始遍历直到找到小于Pivot的元素,将这个元素的值赋给lef
2020-06-13 14:50:28
847
1
原创 白话Shell排序,一分钟理解
前面我已经介绍了插入排序,可以知道,插入排序每次只能移动相邻的两个元素,这样效率是非常慢的。今天我介绍另一种排序Shell排序。顾名思义Shell排序是由叫Shell这个人发明的(哈哈),其实本质上Shell排序也是插入排序,只不过在此之前要进行分组。所有又可以理解为分组插入排序(理解分组插入含义特别重要,这里的分组是指逻辑分组)。惯例,还是举例说明:(这里的插入排序是在分完组的基础上排序,也就是在组内进行比较)。由此可见,通过第一轮的分组再排序,那些比较小的数据大致上都换到了前面。这就避免了插入排序由
2020-06-12 11:31:27
331
2
原创 超详细推导八大排序之插入排序
插入排序思路:首先把一组数据分成两个部分,一部分是已经排好顺序的,这里我按照从小到大排列(这部分记作A),一部分是待排列数据(这部分记作B),默认排列好的部分只有一个数据也就是arr[0],然后将后面的数据依次与arr[0]比较,如果小于arr[0]则需要插入到arr[0]的前面(因为是从小到大的嘛)没理解没关系,现在我举例详细说明:如图,此时默认排列好的数据只有arr[0],除此之外都是待排数据.首先进行第一轮排序比较。这里的比较是从后向前比较,也就是从待排序元素后面的一个元素依次向前比较。arr1
2020-06-11 19:23:35
237
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人