收藏 分享(赏)

第九章 排序.ppt

上传人:gnk289057 文档编号:8010996 上传时间:2019-06-04 格式:PPT 页数:90 大小:648KB
下载 相关 举报
第九章 排序.ppt_第1页
第1页 / 共90页
第九章 排序.ppt_第2页
第2页 / 共90页
第九章 排序.ppt_第3页
第3页 / 共90页
第九章 排序.ppt_第4页
第4页 / 共90页
第九章 排序.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

1、第 九 章,排 序,2019/6/4,山东师大信息学院 Zheng Zhihua,2,第九章 内部排序,9.1 概述 9.2 插入排序 9.3 快速排序 9.4 堆排序 9.5 归并排序 9.6 基数排序 9.7 各种排序方法的综合比较,2019/6/4,山东师大信息学院 Zheng Zhihua,3,定义,9.1 概 述,排序就是把一组无序的记录按其关键字的某种次序排列起来,使其具有一定的顺序,便于进行数据查找。,2019/6/4,山东师大信息学院 Zheng Zhihua,4,例如 将下列关键字序列,52, 49, 80, 36, 14, 58, 61, 23, 97, 75,调整为,14

2、, 23, 36, 49, 52, 58, 61 ,75, 80, 97,2019/6/4,山东师大信息学院 Zheng Zhihua,5,9.1 概 述,分类,内部排序外部排序,-待排序文件的全部记录存放在内存进行的排序,称为内部排序。,-排序过程中需要进行内外存数据交换的排序,称为外部排序。,2019/6/4,山东师大信息学院 Zheng Zhihua,6,内部排序方法(按排序原则分类),插入排序,4. 交换排序,3. 选择排序,5. 归并排序,9.1 概 述,2. 快速排序,2019/6/4,山东师大信息学院 Zheng Zhihua,7,9.1 概 述,按工作量大小分类简单排序 O(n

3、2)先进排序 O(nlog2n)基数排序 O(d*(n+r),2019/6/4,山东师大信息学院 Zheng Zhihua,8,9.1 概 述,稳定性,若相同的排序码在排序前后的记录的相对位置不变的称为稳定排序。,52, 49, 80, 36, 14, 58, 61, 23, 97, 58, 75,14, 23, 36, 49, 52, 58, 58, 61 ,75, 80, 97,例,2019/6/4,山东师大信息学院 Zheng Zhihua,9,9.1 概 述,排序中的操作,比较两个排序码的大小 移动一条记录,2019/6/4,山东师大信息学院 Zheng Zhihua,10,9.1 概

4、 述,待排序记录的存储方式,存储在连续单元中(数组) 用链表存储 记录存于连续单元中,同时另设一个指示各记录存储位置的向量,排序过程中不移动记录,只修改记录地址。,2019/6/4,山东师大信息学院 Zheng Zhihua,11,9.2 插入排序,直接插入排序 折半插入排序 2-路插入排序 表插入排序 重排记录 希尔排序,2019/6/4,山东师大信息学院 Zheng Zhihua,12,1. 直接插入排序 (基于顺序查找),基本思想,每一趟将一个待排序的记录,按其关键字的大小插入到已经排序的部分文件的合适位置上(有序子文件记录数增1),直到全部插入完成。,2019/6/4,山东师大信息学院

5、 Zheng Zhihua,13,有序序列R1i-1,Ri,无序序列 Rin,一趟直接插入排序的基本思想,有序序列R1i,无序序列 Ri+1n,例 已知待排序的一组记录的初始排列为 R(49, 38, 65, 97, 76, 13, 27, 49),第一趟49 , 38, 65, 97, 76, 13, 27, 49,第二趟38 ,49 , 65, 97, 76, 13, 27, 49,第三趟38 ,49, 65 , 97, 76, 13, 27, 49,第一趟49 , 38, 65, 97, 76, 13, 27, 49,第二趟38 ,49 , 65, 97, 76, 13, 27, 49,

6、2019/6/4,山东师大信息学院 Zheng Zhihua,15,从Ri-1起向前进行顺序查找, 监视哨设置在R0;,R0 = Ri; / 设置“哨兵”,循环结束表明Ri的插入位置为 j +1,R0,j,Ri,for (j=i-1; R0.keyRj.key; -j); / 从后往前找,j=i-1,插入位置,2019/6/4,山东师大信息学院 Zheng Zhihua,16,对于在查找过程中找到的那些关键字不小于Ri.key的记录,并在查找的同时实现记录向后移动;,for (j=i-1; R0.keyRj.key; -j); Rj+1 = Rj,R0,j,Ri,j= i-1,上述循环结束后可

7、以直接进行“插入”,插入位置,令 i = 2,3,, n, 实现整个序列的排序。,for ( i=2; i=n; +i )if (Ri.keyRi-1.key) 在 R1i-1中查找Ri的插入位置;插入Ri ;,void InsertionSort ( SqList +i ) if (L.ri.key L.ri-1.key) / InsertSort,L.r0 = L.ri; / 复制为监视哨 for ( j=i-1; L.r0.key L.rj.key; - j )L.rj+1 = L.rj; / 记录后移 L.rj+1 = L.r0; / 插入到正确位置,2019/6/4,山东师大信息学院

8、 Zheng Zhihua,19,2. 折半插入排序,即在直接插入的算法中,对已排序序列查找插入位置时,用折半查找法实现。,算法思想,14 36 49 52 80,58 61 23 97 75,i,low,high,m,m,low,low,m,high,14 36 49 52 58 61 80,23 97 75,i,low,high,m,high,m,high,m,low,例如:,再如:,插入 位置,插入 位置,L.r,L.r,void BiInsertionSort ( SqList &L ) / BInsertSort,在 L.r1i-1中折半查找插入位置;,for ( i=2; i=L.

9、length; +i ) / for,L.r0 = L.ri; / 将 L.ri 暂存到 L.r0,for ( j=i-1; j=high+1; -j )L.rj+1 = L.rj; / 记录后移,L.rhigh+1 = L.r0; / 插入,low = 1; high = i-1; while (low=high) ,m = (low+high)/2; / 折半,if (L.r0.key L.rm.key)high = m-1; / 插入点在低半区 else low = m+1; / 插入点在高半区,2019/6/4,山东师大信息学院 Zheng Zhihua,23,目的减少移动记录次数(约

10、为n2/8)使用DS:辅助向量:d1. . n 同 r1. . n,指针:filst 和final(当前最小和最大值位置),3. 2-路插入排序,将d1视为有序文件的中间记录,并将待插入记录 r.key与d1.key进行比较若r.keyd1.key: 则将r插入到 dfirst- dn之间。若r.keyd1.key: 则将r插入到d1- dfinal之间。,算法思想,2019/6/4,山东师大信息学院 Zheng Zhihua,24,例 初始关键字序列 R49,38,65,97,76,13,27,49,2019/6/4,山东师大信息学院 Zheng Zhihua,25,为了减少在排序过程中进行

11、的 “移动”记录的操作,必须改变排序过程中采用的存储结构。利用静态链表进行排序,并在排序完成之后,一次性地调整各个记录相互之间的位置,即将每个记录都调整到它们所应该在的位置上。,4. 表插入排序(存储结构为链式存储),2019/6/4,山东师大信息学院 Zheng Zhihua,26,4. 表插入排序(为存储),链式存储结构,# define size 100tyupedef struct keytype key ; /关键字int next ; /指针域 SLNode Ssize ;,2019/6/4,山东师大信息学院 Zheng Zhihua,27,例(49,38,65,97,76,13,

12、27,49),初态,1,2,void LInsertionSort (Elem SL , int n)/ 对记录序列SL1n作表插入排序SL0.key = MAXINT ;SL0.next = 1; SL1.next = 0;for ( i=2; i=n; +i )for ( j=0, k = SL0.next;SLk.key=SLi.key ; j=k, k=SLk.next ) SLj.next = i; SLi.next = k; / 结点i插入在结点j和结点k之间 / LinsertionSort,2019/6/4,山东师大信息学院 Zheng Zhihua,29,算法中使用了三个指针

13、: 其中:p指示第i个记录的当前位置i指示第i个记录应在的位置q指示第i+1个记录的当前位置,如何在排序之后调整记录序列?,void Arrange ( Elem SL , int n ) p = SL0.next; / p指示第一个记录的当前位置for ( i=1; in; +i ) while (pi) p = SLp.next;q = SLp.next; / q指示尚未调整的表尾if ( p!= i ) SLpSLi; / 交换记录,使第i个记录到位SLi.next = p; / 指向被移走的记录p = q; / p指示尚未调整的表尾,/ 为找第i+1个记录作准备 / Arrange,2

14、019/6/4,山东师大信息学院 Zheng Zhihua,31,基本思想,9.2.3 希尔排序(Shell),把下表按一定增量分组,对每组记录使用插入排序,随着增量逐渐减少,所分成的组包含的记录越来越多,到增量值减小到1时,整个数据合成1组,构成一组有序记录,则完成排序。,2019/6/4,山东师大信息学院 Zheng Zhihua,32,希尔排序算法:,先取一个增量d(一般的取d=n/2),把所有的距离位d的倍数的记录放在一起成为一组,将整个待排序列分成若干组. 在各组内施行直接插入排序。 取一个新d(一般取d=n/2),重复1,2,3直至d=1为止。,例 初始序列希尔排序,16 25 1

15、2 30 47 11 23 36 9 18 31,第一趟,增量 d =11/2=5,11 23 12 9 18 16 25 36 30 47 31,第二趟希尔排序,设增量 d = 5/2=2,11 9 12 16 18 23 25 36 30 47 31,第三趟希尔排序,设增量 d = 2/2=1,9 11 12 16 18 23 25 30 31 36 47,11 23 12 9 18 16 25 36 30 47 31,16 25 12 30 47 11 23 36 9 18 31,void ShellInsert ( SqList / 插入 / if / ShellInsert,算法,v

16、oid ShellSort (SqList /一趟增量为dltak的插入排序 / ShellSort,2019/6/4,山东师大信息学院 Zheng Zhihua,36,一、冒泡排序,二、快速排序,9.3 快 速 排 序,2019/6/4,山东师大信息学院 Zheng Zhihua,37,一、起泡排序,例 49 38 65 97 76 13 27 49 55 04,38,49,65,97,76,97,97,97,49,97,97,55,13,97,27,04,void BubbleSort(Elem R , int n) while (i 1) / while / BubbleSort,i =

17、 n;,i = lastExchangeIndex; / 本趟进行过交换的/ 最后一个记录的位置,if (Rj+1.key Rj.key) Swap(Rj, Rj+1);lastExchangeIndex = j; /记下进行交换的记录位置 /if,for (j = 1; j i; j+),lastExchangeIndex = 1;,2019/6/4,山东师大信息学院 Zheng Zhihua,39,二、快速排序(分区交换排序),在待排序的n个记录中任取一个记录(通常取第一个记录),以该记录作为标准,将所有记录分成两组,使第一组中各记录的关键字都小于等于该标准关键字,而第二组中各记录的值都大

18、于等于该标准关键字,并把该记录就排放在这两组的中间位置,这样遍历一趟文件后,将文件以该记录为界分为两部分,然后再对上面两组分别重复上述过程,直到每一部分仅剩一个记录为止。,基本思想,2019/6/4,山东师大信息学院 Zheng Zhihua,40,s,t,例如,2019/6/4,山东师大信息学院 Zheng Zhihua,41,s,t,设 R0=52 为枢轴,将 Rj.key 和 R0进行比较, 要求Rj.key R0,将 Ri.key 和 R0 进行比较, 要求Ri.key R0,j,23,80,14,52,例如,R0,52,j,2019/6/4,山东师大信息学院 Zheng Zhihua

19、,42,例 待排序序列36 24 26 41 65 22 38,36 24 26 41 65 22 38,36,2019/6/4,山东师大信息学院 Zheng Zhihua,43,例 待排序序列36 24 26 41 65 22 38,int Partition (RedType / 返回标准(枢轴)所在位置 / Partition,int Partition (RedType R, int low, int high) / Partition,R0 = Rlow; pivotkey = Rlow.key; / 枢轴,while (lowhigh) ,while(low=pivotkey)-

20、high; / 从右向左搜索,Rlow = Rhigh;,while (lowhigh / 从左向右搜索,Rhigh = Rlow;,Rlow = R0; return low;,void QSort (RedType & R, int s, int t ) / 对记录序列Rst进行快速排序if (s t-1) / 长度大于1 / QSort,pivotloc = Partition(R, s, t);/ 对 Rst 进行一次划分,QSort(R, s, pivotloc-1);/ 对低子序列递归排序,pivotloc是枢轴位置,QSort(R, pivotloc+1, t); / 对高子序列

21、递归排序,void QuickSort( SqList / QuickSort,第一次调用函数 Qsort 时,待排序记录序列的上、下界分别为 1 和 L.length。,2019/6/4,山东师大信息学院 Zheng Zhihua,48,9.4 选择排序,每一趟在 n-i+1(i = 1, 2, , n-1)个记录中选取关键字最小的记录作为有序序列中的 i 个记录。,基本思想,2019/6/4,山东师大信息学院 Zheng Zhihua,49,9.4 选择排序,简单选择排序 树形选择排序 堆排序,2019/6/4,山东师大信息学院 Zheng Zhihua,50,1、简单选择排序(直接选择排

22、序),在所有待排序的n个记录中经过比较找出具有最小关键字的记录,把它与第一个记录对换。 在剩余的n-1条记录中选取最小的记录与第2个记录对换。 以此类推,直至所有记录排完序为止。,方法,2019/6/4,山东师大信息学院 Zheng Zhihua,51,例 36,26,24,41,65,22,38 ,36,26,24,41,65,22,38,i =1,22,36,简单选择排序的算法,void SelectSort (int R, int n ) / 对记录序列R1n作简单选择排序。for (i=1; in; +i) / 选择第 i 小的记录,并交换到位 / SelectSort,j = Sel

23、ectMinKey(R, i); / 在 Rin 中选择关键字最小的记录,if (i!=j) RiRj;/ 与第 i 个记录交换,2019/6/4,山东师大信息学院 Zheng Zhihua,53, 交换次数:正序时交换次数最少,为0次,逆序时最多,为n-1次。 比较次数:与初始文件关键字排列无关,为n(n-1)/2次。 简单选择排序时间复杂度为O(n2),并且是稳定的排序。,算法分析 O(n2),2019/6/4,山东师大信息学院 Zheng Zhihua,54,2、树形选择排序(淘汰制),首先对n个记录的关键字进行两两比较,然后在其中n/2 个较小者之间再进行两两比较,如此重复,直至选出最

24、小关键字的记录为止。,基本思想,2019/6/4,山东师大信息学院 Zheng Zhihua,55,例 49,38,65,97,76,13,27,49,49,38,65,97,76,13,27,49,输出 13,2019/6/4,山东师大信息学院 Zheng Zhihua,56,例 49,38,65,97,76,13,27,49,49,38,65,97,76,27,49,输出 13 、27,2019/6/4,山东师大信息学院 Zheng Zhihua,57,例 49,38,65,97,76,13,27,49,49,38,65,97,76,49,输出 13 、27、38,2019/6/4,山东师

25、大信息学院 Zheng Zhihua,58,算法分析,时间复杂度为O (n log2n) 是稳定排序 所需辅助存储空间较多,2019/6/4,山东师大信息学院 Zheng Zhihua,59,n个元素的序列K1, K2, ,Kn当且仅当满足下列关系时,称之为堆。,或,堆的定义,(小顶堆),(大顶堆),3、堆排序,2019/6/4,山东师大信息学院 Zheng Zhihua,60,ki,k2i,k2i+1,用一维数组 r1n 存放关键字,将 r 看做一棵完全二叉树,每一个结点表示一个记录,r1为根,则 k2i 是 ki 的左孩子; k2i+1 是 ki 的右孩子。,2019/6/4,山东师大信息

26、学院 Zheng Zhihua,61,12,36,27,65,49,81,73,55,40,34,98,是堆,14,不,例如: 12, 36, 27, 65, 40, 34, 98, 81, 73, 55, 49,2019/6/4,山东师大信息学院 Zheng Zhihua,62,什么是堆排序,当堆顶元素输出后,可将剩下的n-1个元素调整成一个新堆,在输出次小的元素如此反复执行,便能得到一个有序序列,这个过程称为堆排序。,定义,2019/6/4,山东师大信息学院 Zheng Zhihua,63,需解决的问题,如何将一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素使之成为一个新的堆

27、。,2019/6/4,山东师大信息学院 Zheng Zhihua,64,解决的问题2,2、如何在输出堆顶元素之后,调整剩余元素使之成为一个新的堆。,调整方法 将堆顶元素和堆的最后一个元素位置交换; 然后以当前堆顶元素和其左、右子树的根结点进行比较(此时,左、右子树均为堆),并与值较小的结点进行交换; 重复,继续调整被交换过的子树,直到叶结点或没进行交换为止。 称这个调整过程为“筛选“。,2019/6/4,山东师大信息学院 Zheng Zhihua,65,所谓“筛选”指的是,对一棵左/右子树 均为堆的完全二叉树,“调整”根结点 使整个二叉树也成为一个堆。,堆,堆,筛选,2019/6/4,山东师大

28、信息学院 Zheng Zhihua,66,98,81,49,73,55,64,12,36,27,40,例如:,是大顶堆,12,但在 98 和 12 进行互换之后,它就不是堆了,,因此,需要对它进行“调整”。,98,12,81,73,64,12,98,比较,比较,2019/6/4,山东师大信息学院 Zheng Zhihua,67,解决的问题1,1、如何将一个无序序列建成一个堆?,方法:从完全二叉树的最后一个非终端结点n/2开始,反复调用筛选过程,直到第一个结点,则得到一个堆。,2019/6/4,山东师大信息学院 Zheng Zhihua,68,建堆是一个从下往上进行“调整”的过程。,40,55,

29、49,73,81,64,36,12,27,98,例如: 排序之前的关键字序列为,12,36,81,73,49,98,81,73,55,现在,左/右子树都已经调整为堆,最后只要调整根结点,使整个二叉树是个“堆”即可。,98,49,40,64,36,12,27,2019/6/4,山东师大信息学院 Zheng Zhihua,69,堆排序的时间复杂度分析:,1. 对深度为 k 的堆,“筛选”所需进行的关键字比较的次数至多为2(k-1);,3. 调整“堆顶” n-1 次,总共进行的关键 字比较的次数不超过2 (log2(n-1)+ log2(n-2)+ +log22) 2n(log2n),因此,堆排序的

30、时间复杂度为O(nlogn)。,2. 对 n 个关键字,建成深度为h(=log2n+1)的堆,所需进行的关键字比较的次数至多 4n;,if ( rc.key = Rj.key ) break; / 再作“根”和“子树根”之间的比较,/ 若“=”成立,则说明已找到 rc 的插/ 入位置 s ,不需要继续往下调整,Rs = Rj; s = j; / 否则记录上移,尚需继续往下调整,if ( jm / 左/右“子树根”之间先进行相互比较/ 令 j 指示关键字较大记录的位置,void HeapAdjust (RcdType &R, int s, int m) / 已知 Rsm中记录的关键字除 Rs 之

31、外均/ 满足堆的特征,本函数自上而下调整 Rs 的/ 关键字,使 Rsm 也成为一个大顶堆 / HeapAdjust,rc = Rs; / 暂存 Rs,for ( j=2*s; j=m; j*=2 ) / j 初值指向左孩子自上而下的筛选过程; ,Rs = rc; / 将调整前的堆顶记录插入到 s 位置,2019/6/4,山东师大信息学院 Zheng Zhihua,72,将两个或两个以上的有序序列 “归并” 为一个新的有序序列。,9.5 归 并 排 序,基本思想,2019/6/4,山东师大信息学院 Zheng Zhihua,73,例 初始关键字49,38,65,97,76,13,27,49 3

32、8 65 97 76 13 2738 49 65 97 13 76 2738 49 65 97 13 27 7613 27 38 49 65 76 97,2019/6/4,山东师大信息学院 Zheng Zhihua,74,2-路归并排序,这种排序方法称为2-路归并排序它的核心操作是采用“取小” 原则将前后相邻的两个有序序列归并为一个有序序列。,例 s1=18, 25, 37, 42 s2= 20, 33, 44 ,r,r2,void Merge (int R, int R2, int l, int m, int h) / 将有序的记录序列 Rlm 和 Rm+1h/ 归并为有序的记录序列 R2l

33、h / Merge,for (i=l , j=m+1; i=m , ,if (i=m) Rkh = Rim;/ 将剩余的 Rim 复制到 R2,if (j=h) R2kh = Rjh;/ 将剩余的 Rjh 复制到 R2,2019/6/4,山东师大信息学院 Zheng Zhihua,77,即:每一趟归并的时间复杂度为 O(n),总共需进行 log2n 趟。,归并排序的时间复杂度为(nlogn),2019/6/4,山东师大信息学院 Zheng Zhihua,78,9.6 基 数 排 序,基数排序的思想类似于扑克牌排列方法。 每个记录都有“多关键字K1, K2,2019/6/4,山东师大信息学院 Z

34、heng Zhihua,79,n 个记录的序列 R1, R2, ,Rn 对关键字 (Ki0, Ki1,Kid-1) 有序是指:,其中: K0 被称为 “最主”位关键字,Kd-1 被称为 “最次”位关键字,对于序列中任意两个记录 Ri 和 Rj(1ijn) 都满足下列(词典)有序关系:(Ki0, Ki1, ,Kid-1) (Kj0, Kj1, ,Kjd-1),多关键字的排序,2019/6/4,山东师大信息学院 Zheng Zhihua,80,最低位优先LSD法,最高位优先MSD法,多关键字排序通常有两种作法,2019/6/4,山东师大信息学院 Zheng Zhihua,81,先对K0进行排序,并

35、按 K0 的不同值将记录序列分成若干子序列之后,分别对 K1 进行排序,., 依次类推,直至最后对最次位关键字排序完成为止。,最高位优先MSD法,对K0 ,K1,K2,2019/6/4,山东师大信息学院 Zheng Zhihua,82,先对 Kd-1 进行排序,然后对 Kd-2 进行排序,依次类推,直至对最主位关键字 K0 排序完成为止。,排序过程中不需要根据 “前一个” 关键字的排序结果,将记录序列分割成若干个(“前一个”关键字不同的)子序列。,最低位优先LSD法,2019/6/4,山东师大信息学院 Zheng Zhihua,83,例如:学生记录含三个关键字: 系别、班号和班内的序列号,其中

36、以系别为最主位关键字。,无序序列,对K2排序,对K1排序,对K0排序,3,2,30,1,2,15,3,1,20,2,3,18,2,1,20,1,2,15,2,3,18,3,1,20,2,1,20,3,2,30,3,1,20,2,1,20,1,2,15,3,2,30,2,3,18,1,2,15,2,1,20,2,3,18,3,1,20,3,2,30,LSD的排序过程如下:,2019/6/4,山东师大信息学院 Zheng Zhihua,84,基数排序的时间复杂度为O(dn),其中:d为“基”-关键字的个数n为记录个数,2019/6/4,山东师大信息学院 Zheng Zhihua,85,基数排序的时

37、间复杂度为O(d(n+rd),其中:分配为O(n)收集为O(rd)(rd为“基”)d为“分配-收集”的趟数,2019/6/4,山东师大信息学院 Zheng Zhihua,86,9.7 各种排序方法的综合比较,2019/6/4,山东师大信息学院 Zheng Zhihua,87,时间性能,1. 平均的时间性能,基数排序,时间复杂度为 O(nlogn):,快速排序、堆排序和归并排序,时间复杂度为 O(n2):,直接插入排序、起泡排序和 简单选择排序,时间复杂度为 O(n):,2019/6/4,山东师大信息学院 Zheng Zhihua,88,2. 当待排记录序列按关键字顺序有序时,3. 简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。,直接插入排序和起泡排序能达到O(n)的时间复杂度, 快速排序的时间性能蜕化为O(n2) 。,2019/6/4,山东师大信息学院 Zheng Zhihua,89,空间性能,指的是排序过程中所需的辅助空间大小,1. 所有的简单排序方法(包括:直接插入、 起泡和简单选择) 和堆排序的空间复杂度为(1);,2. 快速排序为O(logn),为递归程序执行过程中,栈所需的辅助空间;,3. 归并排序所需辅助空间最多,其空间复杂度为 O(n);,2019/6/4,山东师大信息学院 Zheng Zhihua,90,The end,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报