算法
想飞的yu
这个作者很懒,什么都没留下…
展开
-
八大排序——基数排序
基数排序基本思想:推荐去看一个B站不到一分钟的视频,直接秒懂https://www.bilibili.com/video/BV1A54y1D7Kd?from=search&seid=9307508910653867725&spm_id_from=333.337.0.0第一步以LSD为例,假设原来有一串数值如下所示:73, 22, 93, 43, 55, 14, 28, 65, 39, 81首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:01 812 22原创 2021-10-03 20:43:31 · 112 阅读 · 0 评论 -
八大排序——堆排序
堆排序二叉堆:二叉堆是完全二叉树或近似完全二叉树。二叉堆满足两个特性:(1)父结点的键值总是大于或者等于(小于或者等于)任何一个子节点的键值;(2)每个结点的左子树和右子树都是一个二叉堆;当父结点的键值总是大于或者等于任何一个子节点的键值时为大根堆。当父结点的键值总是小于或等于任何一个子节点的键值时为小根堆;基本思想:堆的存储:一般都用数组来表示堆,i结点的父结点下标就为(i-1)/2.它的左右子节点的下标分别为2i+1和2i+2.堆的插入:每次插入都是将新数据放在数组最后。可以发现从这原创 2021-10-03 20:27:02 · 176 阅读 · 0 评论 -
八大排序——希尔排序
希尔排序基本思想:先将整个待排序元素序列分割成若干子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序(因为直接插入排序在元素基本有序的情况下,效率很高);算法分析:稳定性:由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。使用场景:比较在原创 2021-10-03 20:11:45 · 211 阅读 · 0 评论 -
八大排序——快速排序
快速排序基本思想:快速排序是对冒泡排序的一种改进。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类原创 2021-10-03 20:01:17 · 757 阅读 · 0 评论 -
八大排序总结
八大排序稳定/不稳定排序待排序的记录序列中可能存在两个或两个以上关键字相等的记录。排序前的序列中Ri领先于Rj(即i<j)。若在排序后的序列中Ri仍然领先于Rj,则称所用的方法是稳定的。比如int数组[1,1,1,6,4]中a[0],a[1],a[2]的值相等,在排序时不改变其序列,则称所用的方法是稳定的稳定排序:插入排序,基数排序,归并排序,冒泡排序,不稳定排序:快速排序,希尔排序,简单选择排序,堆排序平均时间复杂度O(n^2):直接插入排序,简单选择排序,冒泡排序。在数据规模较原创 2021-10-03 19:51:40 · 109 阅读 · 0 评论 -
八大排序——冒泡排序
冒泡排序基本思想:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。算法分析:算法稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前原创 2021-10-03 17:21:26 · 132 阅读 · 0 评论 -
八大排序——简单选择排序
简单选择排序基本思想第一趟:从第一个记录开始,将后面n-1个记录进行比较,找到其中最小的记录和第一个记录进行交换;第二趟:从第二个记录开始,将后面n-2个记录进行比较,找到其中最小的记录和第2个记录进行交换;…第i趟:从第i个记录开始,将后面n-i个记录进行比较,找到其中最小的记录和第i个记录进行交换;以此类推,经过n-1趟比较,将n-1个记录排到位,剩下一个最大记录直接排在最后;注意事项(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个原创 2021-10-03 16:21:50 · 783 阅读 · 0 评论 -
Java中的回溯算法
回溯算法定义:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜素尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为回溯点。许多复杂的,规模较大的问题都可以使用回溯法。回溯算法模板void backtracking(参数){ if(终止条件){ 收集结果; retu原创 2021-08-14 19:35:16 · 528 阅读 · 0 评论 -
外部排序——大文件排序
外部排序外部排序指的是大文件排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并原创 2021-08-12 21:46:58 · 2872 阅读 · 0 评论 -
八大排序——归并排序
归并排序(Merge sort)定义归并排序时建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)自下而上的迭代和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。代价是需要额外的内存空间。算法步骤申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列原创 2021-08-12 20:37:59 · 174 阅读 · 0 评论 -
力扣-跳跃游戏Ⅱ
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。public int jump(int[] nums) { int length = nums.length; //step记录跳跃的步数 //start为开始的点 //flag为从start开始跳跃能跳到最远的点,并将其作为下次的起点原创 2021-08-05 18:09:32 · 93 阅读 · 0 评论 -
动态规划-使用最小花费爬楼梯为例
动态规划-使用最小花费爬楼梯为例题目描述数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。确定dp数组以及下标含义观察cost数组理解题干,cost[i]是爬上第i个数要花费的体力,每次爬到i,必须从i-1,或者i-2爬上来,新建dp数组原创 2021-08-05 11:30:34 · 154 阅读 · 0 评论 -
平衡二叉树——调整变换规则
平衡二叉树:由来:为了解决二叉树在某些情况下形成链表。特点:平衡因子小于2,进行平衡调整。平衡因子:结点的左孩子-右孩子的绝对值。平衡调整策略:LL型 LR型 RR型 RL型。LL型调整规则(继承左结点的左孩子影响了平衡):将不平衡节点的左孩子提升为新的根节点;将原来的根节点(指不平衡结点),降为新的根节点的右孩子;各子树按大小关系连接。RR型调整规则(继承右结点的右孩子影响了平衡):将不平衡节点的右孩子提升为新的根节点;原根结点变成新的根结点的左孩子;各子树按大小关系相接。LR型调整规则(不原创 2021-07-13 08:15:34 · 514 阅读 · 0 评论 -
力扣:用两个栈实现一个队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )class CQueue { Deque<Integer> stack1; Deque<Integer> stack2; public CQueue(){ stack1 = new LinkedList<Intege原创 2021-07-12 23:07:16 · 94 阅读 · 0 评论 -
二叉树的层次遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层序遍历结果:[ [3], [9,20], [15,7]]这是力扣上的一道题,但是我没有做出来,因此理解了一下官方给的做法。/** * Definition for a binary tree node. * publi原创 2021-07-12 22:33:35 · 46 阅读 · 0 评论 -
H指数问题
H指数题干:给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 N - h 篇论文每篇被引用次数 不超过 h 次。例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。题解:class Solution { p原创 2021-07-11 07:24:40 · 1808 阅读 · 0 评论 -
八大排序之直接插入排序
八大排序之直接插入排序1.算法思路 直接插入排序,根据文字来理解,就是向一个有序数组中插入数据,使其依旧保持有序。通过一个循环使一个无序数组变得有序。2.实现代码public static void directInsert(int[] arr) { int temp = 0; int j = 0; for(int i = 1;i < arr.length;i++) { temp = arr[i]; for( j = i-1;j >= 0;j--) {原创 2021-06-30 11:00:14 · 57 阅读 · 0 评论