Data Structures and Algorithms
文章平均质量分 81
纸上得来终觉浅,绝知此事要躬行
Daniel.Qin
虽千万人,吾亦往矣 !
展开
-
数据结构之线性表
线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。线性表存储数据可细分为顺序存储结构和链式存储结构。一、顺序存储结构和链式存储结构:将数据依次存储在连续的物理空间中,这种存储结构称为顺序存储结构(简称顺序表); 将数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表)。前驱和后继:数据结构中,一组数据中的每个个体被称为“数据元素”(简称“元素”)。例如,下图 显示的这组原创 2021-03-17 21:20:26 · 280 阅读 · 1 评论 -
常见排序算法及其对应的时间复杂度、空间复杂度
常见排序算法及其对应的时间复杂度、空间复杂度:排序算法经过长时间演变,大体可以分为两类:内排序和外排序。在排序过程中,全部记录存放在内存,则成为内排序;如果排序过程中需要使用外存,则称为外排序,本文讲的都属于内排序。内排序有可以分为以下几类: (1)插入排序:直接插入排序、二分法插入排序、希尔排序 (2)选择排序:直接选择排序、堆排序 (3)交换排序:冒泡排序、快速排序 (4)归并排序 (5)基数排序一、插入排序•思想:每步将一个待排序的...转载 2021-03-04 21:05:31 · 6029 阅读 · 1 评论 -
时间复杂度+空间复杂度
写在前面:此文源自公众号:程序员小灰 。同时转自博主《12 26 25》、《不止思考(奎哥)》文章,转载链接文后一并放出,文章清晰明了,po出来与大家共同学习,如有侵权,请留言联系,本人定及时删除!正文:算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是转载 2021-03-04 20:35:19 · 529 阅读 · 1 评论 -
二分查找(递归实现+非递归实现)
二分查找,又称折半查找(Binary Search),是一种效率较高的查找方法。二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。步骤描述:首先确定整个查找区间最中间位置mid=start+(end-start)/2; 将处于表中间位置的关键字arr[mid]与所需查找的关键字key进行比较; 若key=arr[mid],则查找成功;若key<arr[mid],则在前(左)半个区域继续进行二分查找;若key>arr[mid],则在后(右)半个区域继续进行二分查找;原创 2021-03-03 11:04:01 · 494 阅读 · 0 评论 -
数组模拟队列——Java实现
队列简介:队列是一种有序列表,可以用数组或链表来实现。遵循先入先出的原则,即:先存入队列的数据,要先取出,后存入队列的数据的要后取出。在队列中,允许插入数据的一端叫做队尾(rear),允许取出数据的一端则称为队头(front)。使用数组模拟队列示意图如下:数组模拟队列的思路:队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图,其中maxSize 是该队列的最大容量。 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的原创 2020-05-25 21:38:50 · 251 阅读 · 0 评论 -
稀疏数组与普通数组的转换——Java实现
稀疏数组简介:所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据。讲一个实际需求中的例子:现在要编写一个五子棋程序,这便有存盘退出和续上盘的功能,而我们需要用二维数组记录棋盘。用1代表黑子,用2代表蓝子,空白位置用0表示:问题分析:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,所以可采用稀疏数组来压缩数据。稀疏数组适用场景:当一原创 2020-05-23 21:39:39 · 342 阅读 · 0 评论 -
二叉堆(Heap)与二叉查找树(Binary Search Tree)的区别
问题描述通常我们在学习二叉堆和二叉查找树时是很容易混淆的,虽说堆也是一种完全二叉树,但二者差别还是挺大的,本文试做分析。逻辑结构二叉堆和二叉查找树都是结点带权重,并在父子结点间满足某种规则的数据结构。二叉堆是一种完全二叉树,分大根堆、小根堆两种,子结点总是大于或小于父结点。大根堆,顾名思义,根是最大的,每个子结点都要小于父结点,不区分左右儿子谁大谁小,也不必保证某个“孙子结点”一定要小于另一个“儿子结点”。小根堆恰恰相反,根是最小的,每个子结点都要大于父结点,不区分左右儿子谁大谁小,也不转载 2020-05-08 22:55:59 · 3873 阅读 · 0 评论 -
线性查找(linearSearch)与二分查找(binarySearch)比较—Java实现
一、线性查找(顺序查找)定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。算法要求:1.数据存储顺序没有限制;2.存储数据类型没有限制。代码实现:/** * 线性查找:顺序查找法;在给定的一列数组中,一个个查询需要的内容。 * 如果找到返回下标,如果没有找到,返回-1. */import java.util.Scanner;public class LinearSearch { public static void main(String[]原创 2020-05-08 19:06:46 · 1182 阅读 · 1 评论 -
快速排序(Quick Sort)-Java实现
高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放...转载 2020-05-06 12:15:15 · 303 阅读 · 0 评论 -
归并排序(Selection Sort)-Java实现
归并排序(Merge Sort)算法简介:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治策略(Divide and Conquer)(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序...转载 2020-05-04 23:50:21 · 213 阅读 · 0 评论 -
堆排序(Heap Sort)-Java实现
堆排序(Heap Sort)算法简介:堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序分为两种方法:大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;堆排序(Heap Sort...转载 2020-05-04 23:08:51 · 404 阅读 · 0 评论 -
插入排序(Insertion Sort)-Java实现
插入排序(Insertion Sort)算法简介:插入排序是一种丛序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序(Insertion Sort)算法原理:插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。插入排序就类似排纸牌,从牌桌上抓牌排在手里,手里的牌始终是有序的,每次都把...原创 2020-05-02 22:29:53 · 789 阅读 · 0 评论 -
选择排序(Selection Sort)-Java实现
选择排序(Selection Sort)算法简介: 选择排序是利用逐个选择的方式进行排序,逐个选择出数组中的最小(或最大)的元素,顺序放在已排好序的序列后面,直到全部记录排序完毕。选择排序(Selection Sort)算法原理:例如我们有一个数组,我们需要把较小的元素排在前面,把较大的元素排在后面,那么需要选择出最小元素并将其排在序列最前:从待排序列中选出最小(或最大)的一个元...原创 2020-05-02 18:56:29 · 1039 阅读 · 0 评论 -
冒泡排序(Bubble Sort)-Java实现
冒泡排序(Bubble Sort)算法简介:冒泡排序是一种常见的交换排序。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端,所以这个算法才被称为“冒泡排序”。其基本思想是两两比较相邻记录,如果反序则交换,直到没有反序的记录为止。冒泡排序(Bubble Sort)算法原理:例如我们有一个数组,我们需要把较小的元素排在前面,把较大的元素排在后面,那么需要从尾部到尾头部开始比较...原创 2020-04-29 19:07:06 · 404 阅读 · 0 评论 -
判断一个字符串是否为回文字符串—Java实现
简单字符串判断(只考虑包括字母,数字的字符串):回文定义:“回文字符串”就是正读倒读都一样的字符串。如字符串“Abcd121dcba”是一段回文字符串。实现方法:将字符串分成两部分并转换为字符数组,从字符串数组的两端逐个进行比较。实现代码:public class Demo { public static void main(String[] args) { String...原创 2020-04-24 00:02:21 · 4004 阅读 · 0 评论 -
常规有序数组二分查找和旋转有序数组二分查找—Java实现
常规有序数组二分查找二分查找又称折半查找(Binary Search),是一种效率较高的查找方法。二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一...原创 2020-04-23 22:05:36 · 343 阅读 · 1 评论 -
找出数组中最大的元素—Java实现
找出数组中最大的元素—Java实现public class Demo { public static void main(String[] args) { int[] arr= {1,3,15,7,18,2,24,6,8,35,6,34,10,}; System.out.print(PrintMax(arr)); } public static int PrintMax(int...原创 2020-04-22 23:08:09 · 583 阅读 · 0 评论 -
欧几里得算法原理—Java实现
欧几里得算法:又名辗转相除法,欧几里德算法是用来求两个非负整数最大公约数的算法。其计算原理依赖的定理:两个非负整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。其具体计算方法为:用两数中的较大数p除以较小数q,再用出现的余数r1去除除数q,再用出现的余数r2去除余数r1,如此反复,直到最后余数是0为止,最后的除数就是这两个数的最大公约数。举例说明:利用欧几里得算法求两...原创 2020-04-22 21:27:29 · 594 阅读 · 0 评论