常见sort算法

合集下载

scratch经典算法实例

scratch经典算法实例

scratch经典算法实例以下是几个经典的算法实例:1. 冒泡排序算法(Bubble Sort):冒泡排序是一种简单的排序算法。

它通过不断交换相邻的两个元素将最大的元素冒泡到最后一位,然后再对剩下的元素进行同样的操作,直到整个数组排序完成。

2. 插入排序算法(Insertion Sort):插入排序是一种简单直观的排序算法。

它将数组分为已排序和未排序两部分,每次从未排序部分选取一个元素,插入到已排序部分的正确位置。

3. 选择排序算法(Selection Sort):选择排序是一种简单直观的排序算法。

它每次从未排序部分选择最小(或最大)的元素,然后与未排序部分的第一个元素进行交换。

4. 快速排序算法(Quick Sort):快速排序是一种高效的排序算法。

它通过选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后对两部分分别递归地进行快速排序。

5. 归并排序算法(Merge Sort):归并排序是一种高效的排序算法。

它通过将数组分成两部分,对每部分递归地进行归并排序,然后将两个有序的部分合并成一个有序的数组。

6. 二分查找算法(Binary Search):二分查找是一种高效的查找算法。

它通过将有序数组分为两部分,每次根据中间元素与目标值的大小关系,将查找范围缩小一半,直到找到目标值或查找范围为空。

7. 链表反转算法(Reverse Linked List):链表反转是一种常见的操作。

它通过将链表的指针方向逆转,实现原链表的反转。

8. 字符串匹配算法(String Matching):字符串匹配是一种常见的问题。

常用的算法包括暴力匹配、KMP算法和Boyer-Moore算法等,它们通过不同的方法在文本中查找指定的模式串。

以上算法示例都是经典而重要的算法,对算法的理解和掌握有很大帮助。

除了上述算法外,还有很多其他的经典算法,如动态规划、贪心算法、最短路径算法等,它们在实际应用中有着广泛的用途。

【数据结构】常见排序算法复杂度

【数据结构】常见排序算法复杂度

【数据结构】常见排序算法复杂度相关概念1、稳定排序(stable sort)和⾮稳定排序稳定排序是指所有相等的数经过某种排序算法操作后仍然能保持它们在排序之前的相对次序。

反之就是⾮稳定排序。

2、内排序(internal sorting)和外排序(external sorting)在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调⼊内存,并借助内存调整数在外存中的存放顺序排序⽅法称为外排序。

排序算法【冒泡排序】(Bubble Sort)冒泡排序⽅法是最简单的排序⽅法。

这种⽅法的基本思想是,将待排序的元素看作是竖着排列的“⽓泡”,较⼩的元素⽐较轻,从⽽要往上浮。

在冒泡排序算法中我们要对这个“⽓泡”序列处理若⼲遍。

所谓⼀遍处理,就是⾃底向上检查⼀遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。

如果发现两个相邻元素的顺序不对,即“轻”的元素在下⾯,就交换它们的位置。

显然,处理⼀遍之后,“最轻”的元素就浮到了最⾼位置;处理⼆遍之后,“次轻”的元素就浮到了次⾼位置。

在作第⼆遍处理时,由于最⾼位置上的元素已是“最轻”元素,所以不必检查。

⼀般地,第i遍处理时,不必检查第i⾼位置以上的元素,因为经过前⾯i-1遍的处理,它们已正确地排好序。

冒泡排序是稳定的。

算法时间复杂度是O(n2)。

【选择排序】(Selection Sort)选择排序的基本思想是对待排序的记录序列进⾏n-1遍的处理,第 i 遍处理是将[i..n]中最⼩者与位置 i 交换位置。

这样,经过 i 遍处理之后,前 i 个记录的位置已经是正确的了。

选择排序是不稳定的。

算法复杂度是O(n2 )。

【插⼊排序】(Insertion Sort)插⼊排序的基本思想是,经过i-1遍处理后,L[1..i-1]⼰排好序。

第i遍处理仅将L插⼊L[1..i-1]的适当位置,使得L[1..i]⼜是排好序的序列。

要达到这个⽬的,我们可以⽤顺序⽐较的⽅法。

sort merge join原理

sort merge join原理

sort merge join原理
Sort merge join 是一种常见的数据库连接算法,可用于将两个有序数据集进行连接。

它的原理如下:
1. 数据集的排序:首先,需要将要连接的数据集按照连接键进行排序。

这样可以保证相同键值的记录在相邻的位置,方便后续的连接操作。

2. 连接操作:从两个排序后的数据集中分别取出第一个记录,比较它们的连接键的值。

如果两个连接键的值相等,说明这两条记录可以连接,将它们进行连接并输出作为结果。

如果不相等,则将键值较小的记录移动到下一个位置,再次进行比较。

3. 重复连接操作:重复第2步,直到遍历完其中一个数据集的所有记录。

如果还有未遍历的记录,需要继续与另一个数据集中的记录进行比较连接。

4. 完成连接:最后,将连接操作产生的结果作为最终的连接结果输出。

Sort merge join 的时间复杂度为O(nlogn),其中n为两个数据集中记录的数量之和。

由于需要进行排序操作,所以该算法适用于连接大型数据集。

但是,如果数据集本身并不是有序的,那么需要额外的排序操作,会增加算法的时间复杂度。

鸿蒙arkts sort数组集合排序算法

鸿蒙arkts sort数组集合排序算法

鸿蒙arkts sort数组集合排序算法1. 背景介绍鸿蒙操作系统(HarmonyOS)是华为公司推出的全新分布式操作系统,旨在为各种设备(如智能手机、智能家居、车载系统等)提供统一的操作系统和开发框架。

其中,arkts sort数组集合排序算法作为鸿蒙操作系统的核心组成部分之一,为开发者提供了高效、稳定的数组排序功能,为设备的性能优化和用户体验提升提供了重要支持。

2. 算法原理arkts sort数组集合排序算法基于经典的排序算法(如快速排序、归并排序、插入排序等)进行了深度优化和改进,以适应不同规模数组的排序需求。

其核心原理包括以下几点:- 分治思想:将待排序的数组分割成较小的子数组,对子数组进行单独排序,并最终合并成一个有序的数组。

- 优化策略:根据待排序数组的特点(如是否近乎有序、规模大小等),选择合适的排序策略,以达到更好的效率和稳定性。

3. 算法特点arkts sort数组集合排序算法具有以下显著特点:- 高效性能:经过优化的排序算法,在处理大规模数组时能够以较低的时间复杂度完成排序操作,保证了系统的响应速度和资源利用率。

- 稳定可靠:经过严格的测试和验证,排序算法在各种场景下表现稳定可靠,保证了系统的稳定性和安全性。

- 灵活适配:排序算法能够根据不同应用场景和设备评台的需求,灵活选择合适的排序策略,满足了各类排序需求。

4. 应用场景arkts sort数组集合排序算法广泛应用于鸿蒙操作系统的各个模块和应用场景中,如数据管理、图形绘制、多媒体处理等,为系统的性能优化和用户体验提升提供了重要支持。

具体包括以下几个方面:- 数据管理:在文件管理、数据库查询等场景中,对大量数据进行排序和检索操作,提高了数据的访问速度和用户体验。

- 图形绘制:在图形界面的渲染和布局中,对控件的层叠顺序、颜色梯度等进行排序,提高了图形渲染的效率。

- 多媒体处理:在音视瓶解码、流媒体播放等场景中,对数据流进行时间戳排序和帧率控制,保证了多媒体处理的顺畅性和稳定性。

sort函数的时间复杂度

sort函数的时间复杂度

sort函数的时间复杂度
sort函数是一种常用的排序算法,它可以对数组或容器进行排序。

sort函数的时间复杂度取决于所使用的排序算法。

C++ STL中的sort函数采用的是快速排序算法(quick sort),其时间复杂度为O(nlogn)。

快速排序算法是一种基于比较的排序算法,其核心思想是通过不断地划分,将待排序序列分成两个子序列,其中一个子序列中的所有元素都小于另一个子序列中的所有元素,然后递归地对两个子序列进行排序,直到整个序列有序。

快速排序算法的时间复杂度主要取决于划分操作的次数。

在最坏情况下,即当序列已经有序或者逆序时,划分操作将会达到n次,此时快速排序算法的时间复杂度为O(n^2)。

但是在平均情况下,快速排序算法的时间复杂度为
O(nlogn),比其他常用的排序算法(如冒泡排序、选择排序和插入排序)都要快。

总之,sort函数的时间复杂度为O(nlogn),这也是快速排序算法的时间复杂度。

但是需要注意的是,sort函数的性能可能受到具体实现的影响,因此在实际应用中,需要根据具体情况进行测试和选择。

- 1 -。

稳定排序算法的名词解释

稳定排序算法的名词解释

稳定排序算法的名词解释概述:在计算机科学中,排序算法是一种重要的基础算法,用于将一组无序的数据按照某种规则进行排列。

稳定排序算法是其中一种类型的排序算法,其特点是在排序过程中保持具有相同键值的元素相对位置的稳定性。

以下将详细解释稳定排序算法的相关名词及其特点。

排序算法:排序算法是一种用于将一组数据按照某种规则进行排列的算法。

常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。

这些算法根据其不同的实现方式和时间复杂度可分为多个类型。

稳定排序算法:稳定排序算法是一种在排序过程中保持具有相同键值的元素相对位置稳定的排序算法。

相对位置的稳定性意味着排序后元素相对于其他相同键值的元素的相对位置保持不变。

例如,如果有两个相同键值的元素A和B,它们在排序前相对顺序为A在B前面,那么在排序后如果A仍然在B前面,则该排序算法被称为稳定排序算法。

非稳定排序算法:与稳定排序算法相对应的是非稳定排序算法,它在排序过程中无法保持具有相同键值的元素的相对位置。

换言之,非稳定排序算法可能会改变元素之间的相对顺序。

例如,如果有两个相同键值的元素A和B,它们在排序前相对顺序为A在B 前面,但在排序后可能发生A在B后面的情况。

适用场景:稳定排序算法在某些场景下具有重要意义。

例如,在对一组学生成绩进行排序时,如果学生的姓名作为键值,具有相同分数的学生在排序后依然按照姓名的字母顺序排列,这可以确保排序结果的合理性。

此外,稳定排序算法还可以用于多键值排序,即先按一个键值排序,再按另一个键值排序,而不影响前一次排序的结果。

常见稳定排序算法:1. 冒泡排序(Bubble Sort):通过不断交换相邻元素,将较大(或较小)的元素逐渐移动到末尾,以实现排序的目的。

冒泡排序是稳定的排序算法,在排序过程中相同键值的元素相对位置保持不变。

2. 插入排序(Insertion Sort):将未排序的元素逐个插入到已排序的序列中,从而构建出一个有序的序列。

c++ sort函数原理

c++ sort函数原理sort函数是一种常见的排序算法,它可以对数组或者容器中的元素进行排序。

sort函数在C++标准库中,它可以通过#include <algorithm> 头文件引用。

sort函数的原理是基于快速排序算法的,快速排序是一种分治算法,它的思想是通过一趟排序将待排序记录分隔成独立的两部分,其中一部分记录的的关键字比另一部分记录的关键字小或者相等,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

sort函数是C++标准库中用于对序列进行排序的函数。

它有两种实现方式,分别是普通的排序和针对外排序的稳定排序。

sort函数的普通排序使用快速排序(QuickSort)算法,而稳定排序使用归并排序(MergeSort)算法。

在标准库中,sort函数的原型如下:template<class RandomIt>void sort(RandomIt first, RandomIt last);其中,参数first和last指定待排序序列的起始地址和终止地址。

sort函数通过[first,last)指示的范围,对序列[first,last)中的元素按照升序进行排序。

sort函数会修改序列中元素的位置,以使得它们满足排序的条件。

sort函数的实现使用了一般普遍认可的快排算法,以递归的方式进行操作。

快排算法的排序过程可以分为三个步骤:(1)选取一个基准元素pivot(通常选取序列的第一个元素);(2)将小于等于pivot的元素放在pivots的左侧,大于等于pivot的元素放在pivot的右侧;(3)递归地对pivot左侧和右侧的子序列进行快排排序。

快排算法的平均时间复杂度为O(NlogN),最坏时间复杂度为O(N²)。

当代码中使用sort函数对一个数组进行排序时,sort函数默认使用有限制的外部排序(稳定排序),而这种排序算法是基于归并排序的。

归并排序是一种稳定的排序算法,它的基本思路是将待排序序列分成若干个子序列,每个子序列完成排序后再将这些子序列归并成一个序列,直到整个序列有序为止。

排序算法数学公式

排序算法数学公式排序算法是计算机科学中非常重要的一项技术,用于对一组数据进行排序。

不同的排序算法有不同的实现方式和效率,并且在不同的应用场景下会有不同的选择。

本文将介绍几种常见的排序算法,并通过数学公式的方式进行解释,帮助读者理解和选择适合自己需求的排序算法。

1. 冒泡排序算法冒泡排序算法通过比较相邻的元素大小,依次将较大(或较小)的元素交换到右侧。

该过程类似于气泡从水底冒出来的过程,因此得名冒泡排序。

冒泡排序是一种简单但效率较低的排序算法,其时间复杂度为O(n^2)。

冒泡排序的数学公式为:```for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]```2. 插入排序算法插入排序算法的基本思想是将一个元素插入到已排序好的序列中的适当位置,使得插入后的序列仍然有序。

插入排序的时间复杂度也是O(n^2),但相比冒泡排序,其效率要高一些。

插入排序的数学公式为:```for i in range(1, n):key = arr[i]j = i-1while j >= 0 and arr[j] > key:arr[j+1] = arr[j]j -= 1arr[j+1] = key```3. 选择排序算法选择排序算法每次从未排序的部分选择最小(或最大)的元素,然后将其放到已排序序列的末尾。

选择排序的时间复杂度也是O(n^2),但相比冒泡排序和插入排序,其交换次数较少,因此效率更高一些。

选择排序的数学公式为:```for i in range(n):min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]```4. 快速排序算法快速排序算法是一种分治的排序算法,通过选择一个元素作为基准值,将序列划分为左右两个子序列,并递归地对子序列进行排序。

fieldsort类方法详解

一、fieldsort类方法概述在计算机科学中,fieldsort类方法是一种用于排序和筛选数据的常见技术。

该方法通常用于对大量数据进行排序和筛选,以便更方便地进行数据操作和分析。

fieldsort类方法可以应用于各种领域,包括数据库管理、数据分析和算法设计等。

在本文中,我们将详细介绍fieldsort类方法的工作原理、使用场景和实际应用。

二、fieldsort类方法的工作原理1. 数据排序fieldsort类方法的主要功能是对数据进行排序。

它通过比较数据项的键值大小,按照一定的顺序重新排列数据项。

常见的排序算法包括冒泡排序、快速排序和归并排序等。

这些算法可以帮助我们快速高效地对大量数据进行排序,从而提高数据处理的效率。

2. 数据筛选除了排序功能,fieldsort类方法还可以进行数据筛选。

它可以根据设定的条件对数据进行筛选,只保留满足条件的数据项。

这对于数据库查询和数据分析非常有用,可以帮助我们快速地找到需要的数据,减少不必要的数据处理工作。

三、fieldsort类方法的使用场景1. 数据库查询在数据库查询中,fieldsort类方法经常用于对查询结果进行排序和筛选。

通过使用fieldsort类方法,我们可以按照指定的字段对查询结果进行排序,或者根据特定的条件对结果进行筛选。

这可以帮助我们更快速地找到需要的数据,并减少数据检索的时间。

2. 数据分析在数据分析领域,fieldsort类方法也经常被使用。

数据分析通常需要对大量数据进行排序和筛选,以便进行统计分析和图表展示。

fieldsort类方法可以帮助分析人员快速地对数据进行处理,从而更好地理解数据的特征和规律。

3. 算法设计在算法设计中,fieldsort类方法被广泛应用于各种排序和搜索算法的实现。

通过使用fieldsort类方法,我们可以更好地理解和实现各种排序算法,从而提高算法的效率和性能。

这对于算法设计和性能优化非常重要。

四、fieldsort类方法的实际应用1. 订单管理系统在订单管理系统中,我们经常需要对订单数据进行排序和筛选。

deepsort算法概述

deepsort算法概述DeepSORT 算法概述DeepSORT 是一种多目标跟踪算法,它结合了深度学习和排序算法,以提高目标跟踪的准确性和鲁棒性。

该算法包括以下主要步骤:1. 特征提取DeepSORT 使用深度卷积神经网络 (CNN) 从目标中提取空间特征。

这些特征捕获目标的外观,例如形状、颜色和纹理。

2. 关联特征提取后,DeepSORT 使用马氏距离或余弦相似度等度量来计算不同帧中目标之间的相似性。

相似度高的目标被关联为同一条轨迹。

3. 轨迹管理DeepSORT 维护一个轨迹池,其中存储着所有关联目标的轨迹。

每个轨迹由以下属性定义:ID:标识轨迹的唯一标识符。

状态:目标的状态,例如活动、消失或重新出现。

位置:目标的边界框或其他定位信息。

特性:目标的特征向量。

4. 数据关联在每一帧中,DeepSORT 将当前帧中的目标与轨迹池中的现有轨迹进行关联。

关联算法使用加权二部图匹配,其中权重由相似度度量确定。

5. 新轨迹初始化如果无法将目标关联到现有轨迹,DeepSORT 将初始化一个新轨迹。

该轨迹的初始状态设置为活动,并且其属性从目标的特征中获取。

6. 轨迹预测对于每个活动轨迹,DeepSORT 使用卡尔曼滤波器或其他预测算法来预测目标在下一帧中的位置。

预测用于指导与下一帧目标的关联。

7. 轨迹丢失如果目标在连续帧中未能关联到轨迹,则该轨迹将被标记为丢失。

丢失的轨迹保留一段时间,如果目标重新出现,则可以将其重新关联。

DeepSORT 优势DeepSORT 提供了以下优势:高精度:深度学习特征提取可提高目标相似性的准确性,从而提高跟踪精度。

鲁棒性:DeepSORT 对遮挡、光照变化和背景混乱具有鲁棒性。

实时性:该算法经过优化,可在实时应用程序中使用。

可扩展性:DeepSORT 可以轻松扩展到跟踪大量目标。

应用DeepSORT广泛应用于各种领域,包括:视频监控行为分析运动捕捉智能交通系统无人驾驶汽车。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

**选择排序法对十个整数进行排序 ***
****************************************/
//n为数组长度;
void sort(int a[], int n) {
int temp, min;
for (int i = 0; i < n; i++) {
min = i;//先假设最小下标为i
for (int j = i + 1; j < n; j++)
if (a[j] < a[min])
min = j;//对i之后的数进行扫描将最小的数赋予min
if (min != i) {
temp = a[i];
a[i] = a[min];
a[min] = temp;
}//判断min与i是否相等,若=则说明原假设正确反之交换数值
}
}
冒泡排序
void bubble_sort(int array[], int n) {
int i, j, flag, temp;
for (i = 0; i < n - 1; i++) {
flag = 1;
for (j = 0; j < n - i - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = 0;
}
}
if (1 == flag)
// printf("%d ",i); //首先打印出,在第几层循环时顺序已排好
break; //跳出循环
}
return;
}

C++,快排(函数)
void sort(int *a,int low,int high)
{
int t_low= low, t_high = high;
int k=a[low];
if(low>=high) return ;
while(t_low!=t_high)
{
while(t_low < t_high && a[t_high]>=k) t_high --;
a[t_low]=a[t_high];
while(t_low < t_high && a[t_low]<=k) t_low ++;
a[t_high]=a[t_low];
}
a[t_low]=k;
sort(a,low, t_low -1);
sort(a, t_low +1,high);
}

堆排序算法(C)
void sift(int* a,int low,int high){
int i=low;
int j=2*i;
int temp=a[i];
while(j<=high){
if (j { j++; }
if (temp {
a[i]=a[j];i=j;j=2*i;
}else
break;
}
a[i]=temp;
}
void heap_sort(int* a,int n){
int i;
int temp;
for (i=n/2;i>=0;i--)
{
sift(a,i,n-1);
}
for (i=n-1;i>0;i--)
{
temp=a[0];a[0]=a[i];a[i]=temp;
sift(a,0,i-1);
}
}
void sort_print(int* a,int n){
for (int i=0;i {
cout< }
cout<

}
Shell排序的算法实现:
1. 不设监视哨的算法描述
void ShellPass(SeqList R,int d)
{// 希尔排序中的一趟排序,d为当前增量
for(i=d+1;i<=n;i++) // 将R[d+1..n]分别插入各组当前的有序区
if(R[ i ].keyR[0]=R[i];j=i-d; // R[0]只是暂存单元,不是哨兵
do {// 查找R的插入位置
R[j+d]=R[j]; // 后移记录
j=j-d; // 查找前一记录
}while(j>0&&R[0].keyR[j+d]=R[0]; // 插入R到正确的位置上
} // endif

void shellsort(int *a,int n)
{
int k = n/2;
while(k>0)
{
for(int i = k;i< N;i++)
{
int t = a[i];
#if 0
// 算法1
int j = i - k;
while(j >= 0 && t < a[j])
{
a[j + k] = a[j];
j = j - k;
}
#endif
#if 0
排序方法的选择
因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法很重要
(1)若n较小,可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好,它会比选择更少的比较次数;
但当记录规模较大时,因为直接选择移动的记录数少于直接插人,所以宜用选直接选择排序。
这两种都是稳定排序算法。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜(这里
的随机是指基准取值的随机,原因见上的快速排序分析);这里快速排序算法将不稳定。
(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,
快速排序的平均时间最短;
堆排序虽不会出现快速排序可能出现的最坏情况。但它需要建堆的过程。这两种排序都是不稳定
的。
归并排序是稳定的排序算法,但它有一定数量的数据移动,所以我们可能过与插入排序组合,
先获得一定长度的序列,然后再合并,在效率上将有所提高。
(4)特殊的箱排序、基数排序
它们都是一种稳定的排序算法,但有一定的局限性:
1、关键字可分解。
2、记录的关键字位数较少,如果密集更好
3、如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排
序。
堆排序C++描述
#define MAX 100// 数据元素的最大个数
typedef struct
{
int r[MAX];
int length;
}SqList;// 定义一个线性表用于存放数据元素
void HeapAdjust(SqList &L,int s,int m)
{// 已知L.r[s...m]中记录除L.r[s]外均满足堆的定义,本函数用于使
L.r[s...m]成为一个大顶堆
int j;
int e=L.r[s];
for(j=2*s;j<=m;j*=2)
{
if(jif(e>=L.r[j]) break;
L.r[s]=L.r[j];
s=j;
}
L.r[s]=e;
}
void HeapSort(SqList &L)
{// 对顺序表L进行堆排序
int i,e;
for(i=L.length/2;i>0;i--)
HeapAdjust(L,i,L.length);
for(i=L.length;i>1;i--)
{// 将大顶堆的顶记录和最后一个记录相互交换
e=L.r[1];
L.r[1]=L.r[i];
L.r[i]=e;
HeapAdjust(L,1,i-1);
}
}

相关文档
最新文档