数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。
简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。
通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。
上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。
然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。
链接存储结构的含义是在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的),它不要求逻辑上相邻的元素在物理位置上也相邻。
链式存储结构的优点主要是插入和删除简单,前提条件是知道操作位置,时间复杂度是O(1),如果不知道操作位置则要定位元素,时间复杂度为O(n),没有容量的限制,可以使用过程中动态分配的内存空间,不用担心溢出问题,但是它并不能实现随机读取,同时空间利用率不高。
1)快速排序
原理:快速排序采用的是一种分治的思想,通过依次排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
选定一个合适的值(理想情况下选择中间值最好,但实际中一般使用数组第一个值),称为“枢轴”(pivot)。
基于这个值将数组分为两部分,较小的分在左边,较大的分在右边,如此一轮下来,这个枢轴的位置一定在最终位置上。
对两个子数组分别重复上述过程,直到每个数组只有一个元素,排序完成。
复杂度:O(n)
特点:快速排序是平时最常使用的一种排序算法,因它速度快,效率高的一种排序算法。
2)冒泡排序
原理:冒泡排序采用的事两个相邻的值进行比较,将值大的交换到右侧。就是逐一比较交换,进行内外两次循环,外层循环为遍历所有数值,逐个确定每个位置,内层循环为确定位置后遍历所有后续没有确定位置的数字,与该位置的值进行比较,只要比该位置的值小,就位置交换。
复杂度:O(n^2),最佳时间复杂度为O(n)
特点:冒泡排序在实际开发中使用比较少,更适合数据量比较少的场景,因其效率比较低,但逻辑简单,方便记忆。
3)直接插入排序
原理:直接插⼊排序是从第二个数字开始,逐个取出,插入到之前排好序的数组中。
复杂度:O(n^2),最佳时间复杂度为O(n)
4)直接选择排序
原理:直接选择排序是从第一个位置开始遍历位置,找到剩余未排序的数组中最小值,将最小值做交换位置。
复杂度:O(n^2)
特点:类似冒泡排序其逻辑简单,但效率低,适合少量数据排序。
import java.io.File;
public class ListFiles {
public static void listAll(File directory) {
if(!(directory.exists() && directory.isDirectory())) {
throw new RuntimeException("目录不存在");
}
File[] files = directory.listFiles();
for (File file : files) {
System.out.println(file.getPath() + file.getName());
if(file.isDirectory()) {
listAll(file);
}
}
}
public static void main(String[] args) {
File directory = new File("E:\\Program Files (x86)");
listAll(directory);
}
}
树是一种重要的非线性数据结构,它是数据元素(在树中称为结点)按分支关系组织起来的结构,类似自然界中的真实的树。
树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。
树在计算机领域中也得到广泛应用,如在编译源程序时,可用树表示源程序的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。
树是由一个或多个结点组成的有限集合:
1)必有一个特定的称为根(ROOT)的结点;
2)剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且, 这些集合的每一个又都是树。树T1、T2、......Tn被称作根的子树(Subtree)。
树的递归定义如下:
1、至少有一个结点,称为根;
2、其它是互不相交的子树。
树结构的特点是每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前趋。
二叉树是指每个结点最多有两个子树的有序树。
通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树常被用作二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
先序遍历(深度优先遍历):前、中、后这三个词是针对根节点的访问顺序而言的先访问根结点,再访问左子结点,最后访问右子结点。
中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。
后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。
层序遍历(广度优先遍历):先访问树的第一层结点,再访问树的第二层结点……一直访问到最下面一层的结点。在同一层结点中,以从左到右的顺序依次访问。
1、两者性质不同
<