算法
文章平均质量分 74
七号公园的忧伤
点个关注,《不会私信推消息》
展开
-
10 归并排序and快速排序
一、归并排序归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。递推公式:merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))终止条件:p >= r 不用再继续分解代码: public void mergeSort(int[] a, int n){ merge(a, 0, n-1); } public voi原创 2022-01-06 20:38:42 · 357 阅读 · 0 评论 -
09 插入排序and选择排序
一、插入排序首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。代码:// 插入排序,a表示数组,n表示数组大小public void insertionSort(int[] a, int n) { if (n <= 1) return; for (.原创 2022-01-06 20:17:03 · 106 阅读 · 0 评论 -
08 排序-冒泡
排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序、睡眠排序、面条排序等。我只讲众多排序算法中的一小撮,也是最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。我按照时间复杂度把它们分成了三类,分三节课来讲解。一、如何分析一个 排序算法执行效率1.从最好、最坏、平均时间复杂度分析对于要排序的数据,有的可能接近有序、有的可能完全无序。有序程度不同,对排序算法肯定有影响,我们需要知道算法在不通数据下的表现。2.时间复杂度的系数、常数、原创 2022-01-05 20:44:26 · 125 阅读 · 0 评论 -
07 递归
举个生活中的例子:周末,你带着你女朋友去买奶茶,可是这家店太火爆了,排了老长的队伍。突然,奶茶店给出了一个通知,说,只剩最后100杯了,卖完就没了。女朋友问你,现在我们所在位置是第几呀?队伍太长了,你不想一个个数一次。于是你问前面的人他是第几个,这样只需要在他的基础上加1,就知道自己是第几了。但是前面的人也不知道他自己是第几,所以他也问前面的。就这样一个问一个,直到问道了第一个,说我是第一个。然后再这样一个个把数字往后传,直到你前面的人告诉你他是第几,这样你就知道答案了。这就是一个非常标准的原创 2021-12-29 20:59:35 · 192 阅读 · 0 评论 -
06 数据结构-队列
队列概念可以理解为一堆人排队买票,先来的先买,后来的排在后面,不允许插队。也就是先进先出,这就是队列。上一篇栈中,我们学到,栈只有2个操作,入栈和出栈。队列也只有2个操作,入队和出队。入队:放一个数据到队列尾部 出队:从队列头部拿出一个数据。一、顺序队列和链式队列队列和栈一样,既可以用数组实现,也可以用链表来实现。用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。顺序队列的实现:// 用数组实现的队列public class ArrayQueue { // 数组:.原创 2021-12-28 20:46:55 · 106 阅读 · 0 评论 -
05 数据结构-栈
先进后出,后进先出,只允许在一端插入和删除数据。第一次接触栈,会很疑惑,因为相对与数组和和链表,感觉栈给我们的只有限制,没任何优势。其实,特定的数据结构是对特定场景的抽象,操作上越灵活,使用就越不可控,也就更容易出错。当某种浏览器的前进后退,就可以使用栈这种数据结构来处理。一、如何实现一个栈栈主要包含2个操作,在栈顶插入和删除元素。栈既可以用数组实现,也可以用链表实现,数组实现的叫做顺序栈,链表实现的叫做链式栈。以下使用数组实现一个顺序栈:class ArrayStack原创 2021-12-23 20:31:24 · 135 阅读 · 0 评论 -
04 链表
一、什么是链表先从数据结构上看。数组需要一块连续的内存存储,但是,如果存储100M的数据,内存中没有连续的足够打的存储空间时,数组就不适合了。链表正好相反,他不需要连续的内存空间,通过指针将零散的内存块串起来使用。链表结构五花八门,我们只介绍最常用的三种。单链表、双向链表、循环连表。二、单链表刚刚说道,连表是通过指针将一组零散的内存串联在一起。我们把内存块称为链表的节点(node)。为了将节点串联起来,每个节点除了存储数据外,还要存储一个下一个节点的地址。我们把记录下个节点地址.原创 2021-11-25 20:35:38 · 246 阅读 · 0 评论 -
03 数组
提到数组,大家应该都不陌生,接触的第一个数据结构就是数组。尽管数组看起来很简单,也很基础,单大部分人都不了解数组的精髓。比如,数组下标为什么是从0开始的。一、数组特性数组是一种线性表数据结构,使用一组连续的内存空间,存储一组相同数据类型的数据。几个关键字:1.线性表数据排列像一条线一样的结构。每个线性表上的数据只有前后2个方向。除了数组,还有链表、栈、队列。非线性表:比如树、图。2.连续内存空间相同数据类型正是因为这2个限制,才让数组有了一个特性:“随机访问”。但是有利就有弊,这让数组的原创 2021-12-23 19:46:33 · 108 阅读 · 0 评论 -
02复杂度分析
算法的目的就2个,速度快,省内存,如何来衡量代码的效率那?—时间复杂度、空间复杂度。你可能会疑惑,为什么不把代码跑一遍,计算下时间,内存占用,这样不是很准确吗?没问题,这种也可以,但是不同的机器、数据量,对结果影响很大。所以我们需要一个不需要具体的测试环境,就可以粗略的估算出代码效率的方法。##一、大 O 复杂度表示法 int sum(int n){ int res = 0; for (int i =0;i<n;++i){ res += i; } return res;原创 2021-12-23 19:42:55 · 182 阅读 · 0 评论 -
01 为什么要学数据结构和算法
计算机相关专业,培训机构都会教简单的数据结构和算法。但是,绝大部分程序员对数据结构和算法一窍不通,只是听过最基本的数据结构和算法,数组、列表、冒泡、快排。稍微复杂一点的就完全没有概念了。一、大厂面试必考不管校招和社招,算法提是必考的。对于校招,很多人都没有项目禁言,而且大厂也不看重你的项目。注重的是你的基础。所以,算法是重中之重。对于社招,项目经验是一方面,但是算法确实一个最大的门槛。二、对代码的追求进了公司,干的活就是用封装好的接口来堆砌业务代码,CRUD,时间久了,虽然你能用的很熟练。但你并原创 2021-12-23 19:40:59 · 149 阅读 · 0 评论 -
公交车剩余车票算法题
问题:一条路有n个公交车站,第一个站点的下标是0。这条路上有一辆公交车,有m个座位,意思是在起始站可以卖出m个车票。此时,有p张车票被卖出去了,对于每张车票P[i],从s[i]开始到d[i]站点。请问从a站点到b站点,最多剩余多少张票可以用?输入:第一行输入n m p (n个站点,m张票,卖出p张)第二部分输入卖出的p张车票的站点p1 d1p2 d2p3 d3最后一行输入我们要乘坐的a到b站点。思考:第一种情况//输入5 10 30 3...原创 2021-11-12 18:30:13 · 184 阅读 · 0 评论