>?排序可谓是老生常谈了,在这里,我给大家带来一些常用的排序算法。 >?常用的排序算法有八个:**直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序**。每一个排序算法都有其独特的思想,我们不仅要学会它的思想,还要能够在合适的场景中选出合适的排序算法。因此,这一块,要很熟练很熟练。 >?本章所有的排序均以升序为例来讲解,弄懂了升序,降序也是不在话下。
本章给大家带来的是八大排序中的选择排序和堆排序。选择排序为什么被称为最烂的排序?堆排序如何来操作?最开始如何对数组建堆?
我们在学习当中,最常见的算法莫过于排序算法了!而常见的排序算法有八种,本章给大家讲解八大排序中的==直接插入排序和希尔排序
二叉树可以说是我们学习数据结构路上的第二个高的台阶,要想跨越它,需要我们*画图,多理解,多思考它的递归过。前面树的介绍和堆这两篇文章让我们对树有了一定的了解,对于二叉树的概念也有说到,因此,本章不会对二叉树的概念及介绍深入去讲,而是着重于它的实现,着重于理解递归。二叉树是后面一些高阶数据结构的基础,例如:红黑树,AVL树,B树等等。并且,我们在面试当中,也经常会被面试官要求手撕二叉树的相关OJ题,所以,二叉树这一章节就显得额外重要,可不敢遇到困难就退缩了。本章实现的二叉树是一棵普通的二叉树,与之前的数据结构有所不同,它的增删查改功能没那么有意义,那么什么时候有意义呢?我们在普通二叉树的基础上加上某一性质,使其能够通过这一性质来管理左右子树,这时候的增删查改就有意义了,例如**搜索二叉树等等。搜索二叉树:所以本章的二叉树,是打基础。我们在学习的过程中,一定要细细品味整个递归的过程,最好就是画图理解。接下来就带大家实现一棵属于自己的初等二叉树吧!
前面了解了树的概念后,本章带大家来实现一个跟树有关的数据结构——堆。本章有对堆排序和topk问题的讲解普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把 ==堆== (一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了一个台阶,所以我们要先从最基础的开始,也就是本章的一些知识点。树又分为很多种树,如 二叉树,红黑树,AVL树,B树等等,这些的难度都相对较大,所以大家对本章树的一些概念以及一些基本性质的理解必不可少。本章除了对树的介绍,还有基础的二叉树的相关介绍,目的是为了大家能够更好的理解树。
前面我们 用队列实现了一个栈 ,用栈实现了一个队列 ,相信大家随随便便轻松拿捏,而本章将带大家上点难度,我们来 设计一个循环队列。对于循环队列,重点就在一个 ==“ 循环 ”,意思也就是该队列首尾相连形成一个环,但其本质还是不变,队列 先进先出 的性质依旧存在,只不过环的大小有限定(限定放多少数据就只能放多少数据)。那么我们如何来设计这样的一个环,使它既能够像队列一样,又可以体现循环的性质?下面就带大家探讨一波。
上一章我们用队列实现了一个栈,而这一章就带大家用栈实现一个队列。用队列实现一个栈,用的是两个队列,其出栈操作可以说是最麻烦的一步,它通过倒数据的方式最后完成出栈。而用栈实现一个队列,很明显也是需要两个栈来完成的,其出队操作其实也与倒数据的方式有关,不过两个实现方法有所不同。用队列实现栈,是通过队列的 先进先出 的性质来实现栈的 后进先出 的性质;而用栈实现队列,是通过栈的 后进先出的性质来实现队列的 先进先出 的性质,大家别弄混淆了。
前面我们相继实现栈和队列,是不是愁没有练手的地方呢?别担心,本章带大家用队列来实现一个栈!我们都知道,栈和队列可以看作为兄弟,一个后进先出(LIFO),一个先进先出(FIFO),他们虽有不同的性质,但总的来说还是不分家的,因为,我们既可以用队列实现栈,也可以用栈实现队列,而本章就先来带大家来了解如何使用队列来实现栈。
栈和队列可以说是一对好兄弟,前面学习了栈,那队列当然也少不了。对于栈而言,队列可以说具有与他相反的性质,本章就给大家领悟一下队列的魅力。队列是一种简单的数据结构,它的主要性质,就是数据先进先出(FIFO),我们可以利用这一性质,在做某些算法题时,以此为切入点,如:单调队列等等。所以说,我们要熟练其性质。
前面我们学习了链表,总算是跨过一个台阶了,本章带大家轻松一波,领悟一下栈的魅力。栈是一种较为简单的数据结构,它的主要性质,就是数据后进先出(LIFO),我们可以利用这一性质,在做某些算法题时,以此为切入点。因此,栈还是挺不错的。
前面学习了单链表的结构,并且做了些许单链表的OJ练习,相信大家已经对单链表的结构了如指掌。因此,本章带来了与单链表同源的但拥有不同的结构的链表---带头双向循环链表供大家学习。可能大家听到带头双向循环链表这个名字,就会认为该结构很复杂(的确很复杂,是链表当中结构最复杂的),肯定比单链表要难许多,说实在的,如果没有前面单链表的铺垫,直接上这个结构,那肯定挺难的。但现在我们有了单链表的基础,并且做了挺多单链表的题了,也就不用怕了。
本章的链表OJ练习,是最后的也是最难的。对于本题,我们不仅要学会解题的思路,还要能够通过这个思路正确的写出代码,也就是思路转化为代码的过程,这应该就是最难的地方了吧。对于OJ练习(5),环形链表的做法的证明一定要理解透彻,因为面试很可能问到噢。
本章的OJ练习相对于OJ练习(4)较为简单。不过,本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。分割链表以一种类似于归并的思想解得,回文链表以一种巧妙复用前面OJ题的思想解得。啰嗦一下:对于本章,最重要的是需要证明为什么这样做可以,所以我们不光要做出来OJ,还要能够理解并自行给出证明。
* 本章的OJ练习相对前面的难度加大了,但是换汤不换药,还是围绕单链表的性质来出题的。我相信,能够过了前面的OJ练习,本章的OJ也是轻轻松松。对于OJ练习(3):着重需要理解的是相交链表那道题的双指针思路,明白为什么可以这样,这样为什么可行。后面遇到类似的题目我还会做么?我们每做一道题目,都要深挖他的题目结构,明白为什么可以这样做。我相信如果你这样去做了,并且不断地练习,到后面,每遇到一个题目,你都会有所印象,并能够很快的指出解这道题的思路。
本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。对于OJ练习(2):其中两道题都可运用快慢指针解题思路,这使得两个题都只需要遍历一次链表即可解答。
对于单链表的OJ练习,需要深刻理解做题的思路</font>,这样我们才能够在任何场景都能够熟练的解答有关链表的问题。关于OJ练习(1):其题目较为简单,思路也好理解,本章与1差不多,难度不大,核心点就在于理解解题思路。
单链表的OJ练习(1) # 反转链表 # 合并两个有序链表 #
在学习数据结构时,单链表可谓是第一个需要跨越的台阶。从`C语言`到`数据结构`,单链表能够真正的反映我们`C语言`到底学的扎不扎实,那是因为,单链表对于`C语言`中的指针,结构体,以及函数模块的实现**有较高的要求。因此,通过本章的学习,要是能够自我实现单链表,那你的`C语言功底`会厚实,你的`代码能力`也会提升。
顺序表作为数据结构中的小小弟,还是很好应付的。说到数据结构,顺序表是我们的向导,它让你明白数据结构到底是干啥的,为啥数据结构这么的重要。实际上,通讯录的底层就是一个顺序表,里面的增添联系人,删除联系人等一系列操作,都是基于顺序表实现的,这也侧面拖出了数据结构的作用。所以,学好数据结构是必须的。
当我们在利用计算机进行一些计算时,可能会遇到这类问题 : 有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度
基础数据结构顺序表的解析和自我实现。
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号