数据结构与算法
来自于《算法第四版》的一些内容,主要是对于这本书学习的一些笔记。
paynmind
小白一个,只能一步一个脚印。
展开
-
算法题解 —— 栈(1-5)
内容来源于自己的刷题笔记,对一些题目进行方法总结,用 java 语言实现。第一章 栈和队列1. 设计一个有 getMin 功能的栈:题目描述:实现一个特殊的栈,在实现栈的基础上,再实现返回栈中最小元素的操作。解题思路:在设计时,我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为 stackData;另一个栈记为 stackMin。具体的实现方式有两种:(一般情况下)数据压栈时,先对 stackMin 进行判断,如果小于等于栈顶元素,压入 stack原创 2020-12-19 14:22:36 · 360 阅读 · 2 评论 -
二叉搜索树
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:二叉树是是一种能将链表插入的灵活性和有序数组的高效性结合起来的符号表实现。具体来说,就是使用每个结点含有两个连接(链表中每个结点只含有一个链接)的二叉查找树来高效地实现符号表,这也是计算机科学中重要的算法之一。在二叉树中,每个结点只能有一个父结点(只有一个例外,也就是根结点,它没有父结点),而且每个结点都只有左右两个链接,分别指向自己的左子结点和右子结点。在二叉搜索树中,每个结点还包含一个键和一个值,键之间也有顺序之分原创 2020-10-25 00:23:01 · 702 阅读 · 1 评论 -
java 实现十大排序算法
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 算法分类:十种常见的排序算法你可以分为两大类:比较类算法:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。2. 算法复杂度:3. 索引:冒泡排序选择排序插入排序希尔排序归并排序快速排序堆排序计数排序桶排序原创 2020-10-06 13:04:57 · 1520 阅读 · 1 评论 -
十 基数排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:基数排序的排序思路是这样的:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小,一直到最高位。排到最后,就是一组有序的元素了。不过,他在以某位数进行排序的时候,是用“桶”来排序的。2. 算法:找出其中的最大值,通过最大值的位数确定外层循环的次数创建十个桶并且初始化进行每一趟的排序,从低位到高位,如果从高位到低位,会使每个不同值的元素都会占据一个“桶”3. 代码实现:/*原创 2020-10-06 12:55:27 · 236 阅读 · 0 评论 -
九 桶排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。2. 算法:创建这些桶,确定每一个桶的区间范围:区间跨度(大小) = (最大值-最小值)/ (桶的数量 - 1)遍历原始数列,把元素对号入座放入各原创 2020-10-06 11:50:07 · 237 阅读 · 0 评论 -
八 计数排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:计数排序是一种适合于最大值和最小值的差值不是不是很大的排序。基本思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数,例如 temp[i] = m, 表示元素 i 一共出现了 m 次。最后再把临时数组统计的数据从小到大汇总起来,此时汇总起来是数据是有序的。2. 算法:得到数列的最大值和最小值创建统计数组并统计对应元素个数统计数组做变形,后面的元素等于前面的元素之和倒序遍历原始数列,从统计原创 2020-10-06 10:43:41 · 109 阅读 · 0 评论 -
七 堆排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余 n-1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序序列了原创 2020-10-06 10:07:00 · 280 阅读 · 0 评论 -
六 快速排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:快速排序是一种分治的排序算法,它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序是将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。在第一种情况中,递归调用发生在处理整个数组之前;在第二种情况中,递归调用发生在处理整个数组之后。在快速排序中,切分的位置取决于数组的内容。2. 算法:该方法的关键原创 2020-10-06 00:10:11 · 138 阅读 · 0 评论 -
五 归并排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。2. 算法:实现归并的一种直截了当的方法是将两个不同的有序数组归并到第三个数组中,两个数组的元素应该都实现了 Comparable 接口。但是,当归并将一个大数组排序的时候,我们需要进行很多次归并,因此不能采取每次归并时都创建一个新数组来存储排序结果的方式。更希望有一种原地归并的方法,这样就可以先将前半部分排序,再将后半部分排序,然后在数组原创 2020-10-05 22:56:53 · 310 阅读 · 1 评论 -
四 希尔排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:希尔排序是一种基于插入排序的快速的排序算法,对于大规模乱序数组插入排序很慢,因为它之后交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另外一端。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。2. 算法:希尔排序的思想是使数组中任意间隔为 h 的元素都是有序的,这样的数组被称为 h 有序数组。在进行排序的时候,如果 h 很大,我们就能将元素原创 2020-10-05 21:14:36 · 276 阅读 · 1 评论 -
三 插入排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:我们打牌的时候,拿到的牌经常是需要进行排序操作的,一般是一张一张的来,将每一张牌插入到其他有序的牌中的适当位置。基于这种思想,就有了插入算法——通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。2. 算法:将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序原创 2020-10-05 20:45:36 · 208 阅读 · 0 评论 -
二 选择排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者(最大者)。2. 算法:找到数组中最小的那个元素。将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。在剩下的元素中,找到最小的元素,将它与数组的第二个元素交换位置。如原创 2020-10-05 20:10:41 · 110 阅读 · 0 评论 -
一 冒泡排序
此博客用于个人学习,来源于算法的书籍和网上的资料,对知识点进行一个整理。1. 概述:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2. 算法描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数原创 2020-10-05 00:54:04 · 240 阅读 · 0 评论 -
快速排序
此博客用于个人学习,来源于算法的书籍,对知识点进行一个整理。快速排序引人注目的特点包括它是原地排序(只需要一个很小的辅助栈),且将长度为 N 的数组排序所需要的时间与 NlgN 成正比。1. 基本算法:快速排序是一种分治的排序算法,它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序是将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。在第一种情况中,递归调用发生在处理整个数组原创 2020-08-03 14:55:21 · 139 阅读 · 0 评论 -
归并排序
此博客用于个人学习,来源于算法的书籍,对知识点进行一个整理。归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,是一种典型的分而治之思想的算法应用。1. 概述:要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。2. 原地归并的抽象方法:实现归并的一种直截了当的方法是将两个不同的有序数组归并到第三个数组中,两个数组的元素应该都实现了 Comparable 接口。但是,当原创 2020-08-03 13:53:48 · 138 阅读 · 0 评论 -
初级排序算法
此博客用于个人学习,来源于算法的书籍,对知识点进行一个整理。1.规则:我们关注的主要对象的原创 2020-08-01 15:09:39 · 178 阅读 · 0 评论 -
union-find 算法(并查集)
此博客用于个人学习,来源于算法的书籍,对知识点进行一个整理。1. 概念:union-find 有些地方也称为并查集,往往用于解决图上的问题,并查集只有两个操作,“并” 和 “查”,但是通过这两个操作可以派生出一些其他的应用:图的连通性问题集合的个数集合中元素的个数图的连通性很好理解,一个图是不是连通的是指,“如果是连通图,那么从图上的任意节点出发,我们可以遍历到图上所有的节点”, 这里我们只需要将在图上的节点放到相同的集合中去,然后去看是不是所有的节点均指向同一个集合即可。2. 并查集的A原创 2020-07-31 20:25:23 · 1050 阅读 · 2 评论