第十七天 Java的基础学习(十一)

一、排序算法

排序算法是算法的分类之一。

排序算法又可以分为内部排序和外部排序。

内部排序是数据记录在内存中进行排序。

外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。

第十七天 Java的基础学习(十一)_第1张图片

 in-place指在内存中进行排序

out-place指一次不能容纳全部的排序记录,在排序过程中需要访问外存

●算法的稳定性:

假定在待排序的记录序列中存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

二、选择排序

●选择排序是一种简单直观的排序算法,用选择排序的时候,数据规模越小越好。不占用额外的内存空间。

●步骤

①首先在未排序的序列中找到最小(大)元素,存放到排序序列的起始位置。

②再从剩余元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

③重复第二步,直到所有元素均排序完毕。

④选择排序就是从要未排序的数组中找出最小的一个数,然后放在第一个位置。

⑤然后再从剩下的数据中再找出最小的数,然后放在第二个位置。以此类推。

⑥如果有10个数进行排序,那么我们只要找到最小的9个排好序即可,最后一个自然是最大的数。

注:

    假设的脚标元素为最小的元素,不需要交换位置

   比较一轮找到最小|最大元素脚标,才完成位置交换

三、插入排序

●插入排序的代码实现虽然没有冒泡排序和选择排序那么简单,但是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

●步骤

①将要排序数组的第0个元素当做是已经排好序的数组

②从第1个到最后一个分别进行检索

③将每次检索到的数据依次和前面的进行比对(前面的都是已经排好的)

④比如和前一个比较,比前一个小,那就交换,然后接着再和前一个比,直到不小于前一个为止。

四、快速排序

●快速排序使用分治法(Divide and conquer)把一个串行(list)分为两个子串行(sub-lists)。本质上来看,快速排序是在冒泡排序基础上的递归分治法。它是处理大数据最快的排序算法之一。

●步骤

①选择要排序数组的左边第一个元素作为基准。

②然后从要排序数组的最右边开始进行检索,找比基准数小的,找到后就先停止检索。

③然后从要排序数组的最左边开始进行检索,找比基准数大的,找到后就先停止检索。

④将上面两个找到的元素进行交换。

⑤交换完后,接着使用同样的方式进行检索。

⑥当左边索引和 右边索引相等时,停止检索,并且将基准数和相等的这个索引元素进行交换。

⑦然后在相遇的这个位置,左边的元素都比基准数小,右边的元素都比基准数大接下来,接着分别对相遇索引的左边和相遇索引的右边 进行同样的快速排序操作。

五、折半查找

折半查找又称为二分查找,这种查找方法需要满足两个条件:

①首先,查找表必须使用顺序存储结构;

②其次,查找表必须按关键字大小有序排列。

折半查找 二分查找:

前提:数组中的元素必须有顺序

将(小脚标+大脚标)/2,根据计算的中间脚标获取中间脚标元素值,和寻找的值相同,直接返回;

不同:比中间值小,中间元素的左边继续找;比中间值大,中间元素的右边继续找。

以此类推,找到对应的元素,返回该元素的脚标;

没有找到,返回-1。

六、数据结构

数据是软件开发的核心。在软件开发过程中通常都是对数据新增、删除、修改、查看的操作。

数据结构(Data Structure):计算机存储数据、操作数据的方式。这些数据按照特定结构组成一个集合。数据结构是一种宏观概念,里面包含多种具体的数据结构。

例如:数组、链表、堆、栈、队列、树、图、散列表等。

●分类

数据结构可以按照存储结构进行分类,也可以从逻辑上进行分类。

•存储分类

数据结构存储是按照数据在计算机中存储的方式进行分类的,主要分为:顺平存能结物、错式存能转构,索3存储结构、散列存储结构。

①顺序存储结构

数据存储到一块连续的空间。Java中数组就是顺序存储结构的一种。

优点:地址连续,遍历效率高。

缺点:中间插入或删除数据时效率低。

②链式存储结构

数据存储到非连续空间中。每个数据存储后面数据的地址,形成链式结构。

优点:插入和删除数据效率相对较高。

缺点:遍历效率低。丧失随机访问能力。

③索引存储结构

除了存储的数据外,额外还有索引表存储数据的索引信息。MySQL数据库、MongoDB等存储工具都支持索引。

④散列表(Hash)存储结构

散列表存储结构是对数据做计算,直接得到数据存储时内存地址。使用顺序结构和链式结构共同实现。

•逻辑分类

数据结构从逻辑上分为:线性结构、树形结构、图状结构。

逻辑分类产生的数据结构,存储到计算机中还是按照存储分类进行存储的。逻辑分类按照前一个数据和后一个数据数量对应关系进行的分类。

① 线性结构

数据和数据之间定义了线性关系。除首位和尾位不相连以外,里面内容都是有顺序的。而且是1对1的关系,也就是说一个数据的后面只能跟一个数据,一个数据的前面也只能有一个数据。

数组、链表、堆、栈、队列就是线性结构的实现。

②树形结构

数据之间具有层次关系。数据是1对多的关系,也就是说一个数据后面可以有多个数据,这个数据前面只能有一个数据。

树形结构有很多种:普通树、二叉树、二叉搜索树、平衡二叉搜索树、红黑树、B树等。

③ 图形结构

数据之间是网状关系。数据是多对多的关系,也就是说一个数据后面可以有多个数据,这个数据前面也可以有多个数据。

七、数据结构-数组(Array)

Arrays:数组工具类(工具类中提供了方便操作数组的方法)

Arrays.toString(数组名):将数组转换为字符串

Arrays.sort(数组名):数组中元素排序

Arrays.copyof(原数组名,新数组长度):数组扩容

●可变长数组:

数组特点:

①长度固定.数组创建完成后长度不允许再修改

创建数组时:

     长度太小,存储不足

      长度太大,浪费空间

    可变长数组:

     实现原理:数组扩容,存储不足时,创建新数组,将原数组中元素拷贝到新数组中,将元素添加到新数组中

②存储相同类型的数据

③数组在堆空间中的地址为连续的

④0<=脚标<=数组长度-1

⑤数组为引用数据类型,栈中存储地址

⑥顺序存储结构,线性结构

     遍历效率高,可以随机访问

     添加|删除时效率低,需要移动元素

●泛型:创建对象时,可以通过泛型指定参数的类型,属性的类型,返回值的类型

●equals()方法:引用数据类型比较实际存储的值

子类没有重写父类中的该方法,按照地址比较,重写了该方法可以按照存储的值比较

●toString()方法:打印时,自动调用toString()方法

子类没有重写父类中的该方法,打印包名+类名+@+地址,重写了该方法将属性值变为字符串输出

八、数据结构 -链表

   链表的存储分类为链式结构,非连续的空间。

    链表第一个结点称为头结点,最后一个结点称为尾结点。

●分类

①单向链表:

如果前一个结点存储了后一个结点地址,后一个结点没有存储前一个结点地址,这种链表称为单向链表

②双向链表

如果前一个结点存储了后一个结点地址,后一个结点也存储前一个结点地址,这种链表称为双向链表

③循环链表

•链表分类:单向非循环链表、单向循环链表、双向非循环链表、双向循环链表。

●只包含一个结点

链表中只有一个结点,该结点即为头结点又为尾结点

       头结点:从前向后的第一个结点

      尾结点:从后向前的第一个结点

●存储空间不连续。

中间新增、删除元素效率高于数组。

遍历效率,丧失随机访问的能力。

九、ArrayList和LinkedList

●对比

ArrayList和LinkedList存储的数据都是有序可重复的。

•remove():

     ArrayList:删除元素后需要将删除元素后面所有的元素依次向前移动。

      LinkedList:修改结点中上个节点,下个节点的引用。

•get():

      ArrayList:直接通过索引值,取出数组指定脚标内容。

      LinkedList:需要通过头|尾结点,遍历寻找获取的元素。

•add():

      ArrayList:直接按照下标添加到数组中,可能出现扩容。

    LinkedList:头插,尾插。

•中间插入:

     ArrayList:插入后把后面所有元素都后移,可能出现扩容现象。

     LinkedList:插入后修改前后结点指向。

●ArrayList适合做查询(使用下标进行查询)。

   LinkedList适合做插入、删除。

十、数据结构-栈(Stack)

栈(Stack)是一种存储受限的线性结构。其具体实现可以用链表或数组。栈只允许从一侧进行操作数据,这侧称为栈顶(top)。另一侧称为栈底(bottom)。往栈中放入元素的过程称为:入栈(push)。

从栈中删除元素的过程称为:出栈(pop)。

由于只允许一侧添加或删除数据,所以栈中数据满足:先进后出。

●特点:先进后出;一侧操作数据

十一、、数据结构-队列(Queue)

队列(queue)简称队,是一种运算受限的线性表,其限制是仅允许在一端进行插入,而在另一端进行删除(取出)。

在队列中把插入数据元素的一端称为队尾(rear),删除数据元素的一端称为队首(front)。

向队尾插入元素称为 进队或入队,新元素入队后成为新的队尾元素;从队列中删除元素称为离队或出队,元素出队后,其后续元素成为新的队首元素。

由于队列的插入和删除操作分别在队尾和队首进行,每个元素必然按照进入的次序离队,也就是说先进队的元素必然先离队,所以称队列为 先进先出表(First In First Out,简称FIFO)。

●双端队列deque

double ended queue 通常读为"deck"

双端队列是指两端都可以进行进队和出队操作的队列,将队列的两端分别称为前端和后端,两端都可以入队和出队。其元素的逻辑结构仍是线性结构

输出受限的双端队列,即一个端点允许插入和删除,另一个端点只允许插入的双端队列。 

输入受限的双端队列,即一个端点允许插入和删除,另一个端点只允许删除的双端队列。

十二、数据结构-树(Tree)

树就是数组和链表折中的结果。比数组新增、删除效率高,比链表查询效率高。由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。

父子关系在树的结点之间建立了一个层次结构。

树的结点包含一个数据元素及若干指向其子树的若干分支。

在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。

●树(tree)是n(n20)个结点的有限集。

或者是一棵空树(n=0),空树中不包含任何结点。

或者是一棵非空树(n=1),此时有且仅有一个特定称为根(root)的结点;

或者是一棵非空树(n>1),其余结点可分为m(m>0)个互不相交的有限集T1,T2,.,Tm,其中每一个本身又是一棵树,并且称为根的子树(sub tree)。

●结点的度与树的度

结点拥的子树的数目称为结点的度(Degree)。

度为0的结点称为叶子(leaf)结点或终端结点。度不为0的结点称为非终端结点或分支结点。除根之外的分支结点也称为内部结点。

树内各结点的度的最大值称为树的度。

●二叉树

每个结点的度(该节点的子节点)均不超过2的有序树,称为二叉树(binary tree)。

二叉树或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树。

二叉树中每个结点的孩子数只能是0、1或2个,并且每个孩子都有左右之分。

位于左边的孩子称为左孩子(左子树),位于右边的孩子称为右孩子(右子树);

以左孩子为根的子树称为左子树,以右孩子为根的子树称为右子树。

•满二叉树:

满二叉树中,每层结点都达到最大数,即每层结点都是满的,因此称为满二叉树。

•完全二叉树:

若在一棵满二叉树中,在最下层从最右侧起去掉相邻的若干叶子结点,得到的二叉树即为完全二叉树。

满二叉树必为完全二叉树,而完全二叉树不一定是满二叉树

•二叉树存储结构有两种:顺序存储结构和链式存储结构。

●二叉搜索树

二叉查找/搜索/排序树BST (binary search/sort tree)

查找树中每个结点都有一个key,排序时的条件是以key作为排序条件。查找树是不允许出现相同key值的结点的。

●平衡二叉搜索树

     平衡二叉树为是了解决查找树成为链表的情况,它具备查找树的优点。

      平衡二叉树(Self-balancing binary search tree)自平衡二叉查找树 又被称为AVL树,它是一棵空树,或它的左右两个子树的高度差(平衡因子)的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定

     平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)平衡二叉树:每个结点的平衡因子都为1、-1、0的二叉排序树。或者说每个结点的左右子树的高度最多差1的二叉排序树。

     平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度

    平衡二叉树的常用实现方法有AVL、红黑树、替罪羊树、Treap、伸展树等

     全完平衡二叉树:左右高度相等。

●红黑树

      红黑树是为了解决平衡树在插入或删除结点时频繁左旋和右旋问题。它具备平衡树的优点。

         R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种平衡二叉树。红黑树的每个结点上都有存储位表示结点的颜色,可以是红(Red)或黑(Black)。 

•特性:

①每个结点或者是黑色,或者是红色。

②根结点是黑色。

③每个叶子结点(NIL)是黑色。[注意:这里叶子结点,是指为空(NIL或NULL)的叶子结点!]

④如果一个结点是红色的,则它的子结点必须是黑色的。

父节点黑色,子节点黑色是允许的

⑤从一个结点到该结点的子孙结点的所有路径上包含相同数目的黑结点。

注:

•特性③中的叶子结点,是只为空(NIL或null)的结点。

•特性⑤,确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

十三、堆(Heap)

堆可以看做是完全二叉树。其存储结构多使用数组实现。

●堆中数据特点:

①堆中某个结点的值总是不大于或不小于其父结点的值;

②堆总是一颗完全二叉树

●堆分为两种:

①最大堆:父结点大于左右子结点。

②最小堆:父结点小于左右子结点。

 

你可能感兴趣的:(学习)