数据结构与算法
文章平均质量分 83
修炼内功
我是才辰
微信公众号:【编程对话】
以通俗易懂的方式讲解算法 计算机基础知识
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
对话:快速排序
才辰和小白正在泰山游玩,他们崭新的旅程也从此起航。 才辰:小白,会排序算法吗? 小白:会啊,我可学过很多种排序算法呢。 才辰:是吗,学会哪几种啊? 小白:冒泡排序、插入排序、希尔排序,还有归并排序,嘻嘻。 才辰:不错嘛,那你知道快速排序吗? 小白:快速排序?这个我不知道,很快吗? 才辰:哈哈,快速排序的平均时间复杂度也是O(nlogn).我介绍一下它的思想,你可要认真听哦。 小白:好的,笔记已经拿出来了。 1. 什么是快速排序 我们从数组中选择一个元素,将此元素作为中轴元素,然后把数组中小于中轴元素的放.原创 2020-10-31 16:38:56 · 270 阅读 · 0 评论 -
图解单链表(关于单链表,看这一篇文章就够了)
Hello,小伙伴们大家好,我是才辰,首先祝大家国庆假期快乐! 这次会为大家带来链表的专题的讲解,这篇文章是专题系列的第一篇,分享一下最基础最常用的单链表。 单向链表是链表中最常用的一种,一个列表节点有两个字段,即数据域和指针域。在单向链表中,指向第一个节点的节点称为“头结点”,最后一个节点的指针域设为null。 例如:列表A={1,3,1,4,5,2,1}的单向链表数据结构如下: 在Java语言中,声明一个Node节点类的代码如下: class Node{ int data; Node next; /原创 2020-10-01 15:52:35 · 1540 阅读 · 0 评论 -
不可不会的归并排序
Hello,大家好,今天带来的是排序算法系列的归并排序。归并排序很重要,可以说是不可不会啊。那下面直接开始! 1 归并排序 简介 所谓归并排序,就是将待排序的数组分成两部分,然后对每个部分递归的进行排序,最后将排好序的部分逐一地合并起来成为一个有序序列。 通过递归的方式将大的数组一直分割,当数组的大小为1时,此时数组就是有序的,再将两个大小为1的有序数组合并成一个大小为2的数组,再将两个大小为2的数组合并成一个大小为4的数组…直到全部小的数组全部合并起来,此时数组排序完成。 2 实例 下面以一个数组arr原创 2020-09-27 09:07:10 · 176 阅读 · 0 评论 -
原来插入排序、希尔排序是这样的
Hello,小伙伴们,大家好,我是才辰。 今天和大家一起学习的是排序算法中的插入排序和希尔排序。为什么把这两个排序放在一起呢?这是因为这两种排序有一定的关联,希尔排序实际上是对插入排序的一种变形。 还是老样子,我先总体上介绍一下算法的过程,接着以一个例子分步讲解,最后给出了详细的代码以及相关分析。 插入排序 插入排序,就和我们平时玩牌是一样的 因为你想,我们在打牌的时候,是不是先把手里的牌由小到大排好,然后每摸到一张牌,就依照大小把它放在排在正确的位置。同样,插入排序也是如此。 步骤: 首先选取数组原创 2020-09-05 17:49:24 · 322 阅读 · 0 评论 -
十大排序算法--冒泡排序
众所周知,十大排序算法是我们必须掌握的算法。这里我先把十个算法的名称列一下: 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 基数排序 堆排序 桶排序 计数排序 因为我想在公众号上建立一个比较完整的知识体系,所以对于比较简单基础的知识我也会写。对于已经学会的小伙伴就当做回顾一下吧。 今天整理了一下比较简单的冒泡排序。 ...原创 2020-08-30 15:48:20 · 269 阅读 · 0 评论 -
题解《动态规划》(一)
Hello,小伙伴们大家好,这篇文章想和大家一起入门一下动态规划算法。 老实说,我感觉动态规划还是很难的,最常见的一种困境就是看答案自己能看明白,但自己想就是想不出来。 网上关于动态规划的讲解也有很多,我认为,学会动态规划的关键,就是我们需要形成自己的解题思路,遇见动态规划的题就要知道应该往哪方面去思考。 那怎么才能形成自己的解题思路呢?无非就是通过做题+整理 的方式。动态规划是有一定的套路的,掌握的套路之后,可以说大部分题就可以做出来了。 这篇文章我先解释一下动态规划的解题步骤,然后重点讲解几个案例,来初原创 2020-08-30 15:38:33 · 825 阅读 · 0 评论 -
递归与动态规划--青蛙跳台阶
本题重点不是怎么做出来,而是学习如何优化自己的算法。 问题一: 一只⻘青蛙⼀一次可以跳上1级台阶,也可以跳上2级。求该⻘青蛙跳上⼀一个n级的台阶总共有多少种跳法? 动态规划解题的三个步骤: 定义dp数组的含义,其中dp数组90%是二维数组,这里问题比较简单,是一维。 找出数组元素之间的关系式,即dp[n]是可以用dp[n-1],dp[n-2]…dp[1],来推出dp[n]的 找出初始值 而对于这个问题。dp[i]的含义为:跳上第I级的台阶共有dp[i]种跳法,这样dp[n]就是所要求的。 接下来是找递推原创 2020-06-26 18:00:43 · 326 阅读 · 0 评论 -
动态规划:最长递增子序列
** 先看一个题目 ** 给定一个无序的整数数组,找到其中最长上升子序列的长度 实例: 输入:[10,9,2,5,3,7,101,18] 输出:4 解释:最长的上升子序列为[2,3,7,101],长度为4 说明: 可能会有多种最长上升子序列的和,只需要输出对应长度即可 算法的时间复杂度应为O(n2) ** 问题分析 ** 首先,dp数组的定义如下:dp[i]表示以nums[i]这个数结尾的最长递增子序列的长度。以上面的栗子为例,dp[5]=3,dp[7]=4 根据这个定义,最终结果应是dp数组中的最大值原创 2020-05-30 21:13:14 · 310 阅读 · 0 评论 -
图的结构
一、图的存储结构 我们知道,数据之间的关系可分为3种,分别是“一对一”、“一对多”、“多对多”,前两种关系可分别用数组和树存储,而多对多的数据结构则需要用图来存储。 图是用(V,E)来表示的,其中V是顶点的集合,E是边的集合。对于图的存储,主要有邻接矩阵和邻接表两种结构。 二、邻接矩阵 邻接矩阵是一个存储着边信息的矩阵,顶点用矩阵下标表示。对于矩阵M,如果M(i,j)=1,则顶点i和顶点j之间存在...原创 2020-03-28 17:07:41 · 4052 阅读 · 0 评论 -
快慢指针(二)
上篇文章写了快慢指针的前两个应用,这篇文章继续写后面两个应用。 判断一个链表是否是回文链表 使用快慢指针还可以判断出一个链表是否是回文链表。具体思路是利用快慢指针找到链表中点,后将中点之后的元素逆序,后再于前半部分一一比较即可。 如何找到链表中点?我们可以设置fast、slow两个指针,fast指针每次移动两个位置,slow指针每次移动一个位置,当fast指针移到链表最后一个元素时,slow指针就...原创 2020-03-14 11:09:17 · 190 阅读 · 0 评论 -
快慢指针(一)
原文在微信公众号【星光指南】,期待和你相遇。 快慢指针的概念 该方法会在一个链表内使用速度不同的两个指针,来解决一些链表中的实际问题。 该方法的主要应用场景: 判断一个链表中是否含有环 若一个链表中含有环,找到环路开始的位置 判断一个链表是否是回文链表 寻找一组数中的重复数 本篇文章先介绍前两个应用。 判断一个链表中是否有环 判断一个链表中是否有环,可以设置两个指针fast、slow,**fa...原创 2020-03-11 18:45:57 · 184 阅读 · 0 评论
分享