链式简单选择排序

合集下载

《数据结构》填空作业题(答案)

《数据结构》填空作业题(答案)

《数据结构》填空作业题答案第 1 章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。

2.程序包括两个内容:数据结构和算法。

3.数据结构的形式定义为:数据结构是一个二元组:Data Structure =( D, S)。

4.数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。

5.数据的逻辑结构可以分类为线性结构和非线性结构两大类。

6.在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。

7.在树形结构中,数据元素之间存在一对多的关系。

8.数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。

9.数据的逻辑结构包括线性结构、树形结构和图形结构 3 种类型,树型结构和有向图结构合称为非线性结构。

10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。

11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。

12.数据的存储结构可用 4 种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。

13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。

14.数据结构在物理上可分为顺序存储结构和链式存储结构。

15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。

16.数据元素可由若干个数据项组成。

17.算法分析的两个主要方面是时间复杂度和空间复杂度。

18.一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。

19.算法具有如下特点:有穷性、确定性、可行性、输入、输出。

20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。

数据结构试题及答案

数据结构试题及答案
6.设有向图G中有n个顶点e条有向边,所有的顶点入度数之和为d,则e和d的关系为e=d。
8.8.(1,3,4,2),(1,3,2,4)
三、应用题
1.1.(22,40,45,48,80,78),(40,45,48,80,22,78)
2.2.q->llink=p; q->rlink=p->rlink; p->rlink->llink=q; p->rlink=q;
3.3.2,ASL=91*1+2*2+3*4+4*2)=25/9
int m;
while(i<j){
while (i<j && r[j]>x) j=j-1; if (i<j) {r[i]=r[j];i=i+1;}
while (i<j && r[i]<x) i=i+1; if (i<j) {r[j]=r[i];j=j-1;}
}
r[i]=x;
}
2.设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示。
(A) n,e(B) e,n(C) 2n,e(D) n,2e
8.设某强连通图中有n个顶点,则该强连通图中至少有()条边。
(A) n(n-1)(B) n+1(C) n(D) n(n+1)
9.设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列()方法可以达到此目的。
4.4.快速排序的最坏时间复杂度为___________,平均时间复杂度为__________。
5.5.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为_________;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有_______个空指针域。

数据结构试卷带答案

数据结构试卷带答案

数据结构试卷(一)一、选择题(20分)1.组成数据的基本单位是( 1.C )。

(A) 数据项(B) 数据类型(C) 数据元素(D) 数据变量2.设数据结构A=(D,R),其中D={1,2,3,4},R={r},r={<1,2>,<2,3>,<3,4>,<4,1>},则数据结构A是( C )。

(A) 线性结构(B) 树型结构(C) 图型结构(D) 集合3.数组的逻辑结构不同于下列(D)的逻辑结构。

(A) 线性表(B) 栈(C) 队列(D) 树4.二叉树中第i(i≥1)层上的结点数最多有(C)个。

(A) 2i (B) 2i(C) 2i-1(D) 2i-15.设指针变量p指向单链表结点A,则删除结点A的后继结点B需要的操作为(.A )。

(A) p->next=p->next->next (B) p=p->next(C) p=p->next->next (D) p->next=p6.设栈S和队列Q的初始状态为空,元素E1、E2、E3、E4、E5和E6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出列的顺序为E2、E4、E3、E6、E5和E1,则栈S的容量至少应该是(.C )。

(A) 6 (B) 4 (C) 3 (D) 27.将10阶对称矩阵压缩存储到一维数组A中,则数组A的长度最少为(C )。

(A) 100 (B) 40 (C) 55 (D) 808.设结点A有3个兄弟结点且结点B为结点A的双亲结点,则结点B的度数数为(8.B(A) 3 (B) 4 (C) 5 (D) 19.根据二叉树的定义可知二叉树共有(B)种不同的形态。

(A) 4 (B) 5 (C) 6 (D) 710.设有以下四种排序方法,则(B )的空间复杂度最大。

(A) 冒泡排序(B) 快速排序(C) 堆排序(D) 希尔排序二、填空题(30分)1.设顺序循环队列Q[0:m-1]的队头指针和队尾指针分别为F和R,其中队头指针F指向当前队头元素的前一个位置,队尾指针R指向当前队尾元素所在的位置,则出队列的语句为F =____________;。

数据结构第八章_排序

数据结构第八章_排序

49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 38 65 97 76 13 27 48 55 4 一趟分组:
一趟排序:13 27 48 55 4 取d2=3 13 27 48 55 4 二趟分组:
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价

38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)

蜂考数据结构答案

蜂考数据结构答案

蜂考数据结构答案1.什么是数据结构?数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

结构包括逻辑结构和物理结构。

数据的逻辑结构包括4种(1)集合:数据元素之间除了有相同的数据类型再没有其他的关系(2)线性结构:数据元素之间是一对一的关系——线性表、栈、队列(3)树形结构:数据元素之间是一对多的关系(4)图状结构:数据元素之间是多对多的关系。

物理结构包括顺序存储结构和链式存储结构。

2.解释一下顺序存储与链式存储顺序存储结构是用一段连续的存储空间来存储数据元素,可以进行随机访问,访问效率较高。

链式存储结构是用任意的存储空间来存储数据元素,不可以进行随机访问,访问效率较低。

3.头指针和头结点的区别?头指针:是指向第一个节点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。

头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入和删除的操作,头结点不是链表的必须元素,可有可无,头结点的数据域也可以不存储任何信息。

4.线性结构的特点(1)集合中必存在唯一的一个"第一个元素";(2)集合中必存在唯一的一个"最后的元素";(3)除最后元素之外,其它数据元素均有唯一的"后继";(4)除第一元素之外,其它数据元素均有唯一的"前驱"。

5.数组和链表的区别?从逻辑结构来看:数组的存储长度是固定的,它不能适应数据动态增减的情况。

链表能够动态分配存储空间以适应数据动态增减的情况,并且易于进行插入和删除操作。

从访问方式来看:数组在内存中是一片连续的存储空间,可以通过数组下标对数组进行随机访问,访问效率较高。

链表是链式存储结构,存储空间不是必须连续的,可以是任意的,访问必须从前往后依次进行,访问效率较数组来说比较低。

如果从第i个位置插入多个元素,对于数组来说每一次插入都需要往后移动元素,每一次的时间复杂度都是O(n),而单链表来说只需要在第一次寻找i的位置时时间复杂度为O(n),其余的插入和删除操作时间复杂度均为O(1),提高了插入和删除的效率。

801计算机专业基础

801计算机专业基础

计算机专业基础》考试大纲注:以下五部分内容只选择两部分进行答题一)、计算机组成原理( 75 分)、考查目标1. 深入理解单处理器计算机系统的组织结构、工作原理、互连结构,具有完整的计算机系统整机的 概念;2. 掌握各部件的组成结构、工作原理、软硬件设计的舍取、以及硬件实现;3. 综合运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计 算、分析,并能对一些基本部件进行逻辑设计。

、考试内容1. 总线:总线的组成、分类、特性和性能指标,总线的层次结构,总线定时、传送、仲裁。

2. 内存储器:存储器的基本概念、分类、层次结构,半导体主存储器,高速缓冲存储器( 差错检测。

3. 输入/输出:I/O 编制的方法,编程I/O 、程序中断、DMA 勺原理及控制机制。

4. 运算方法与运算器:计算机中的数制系统,数的表示方法,定点数四则运算方法,浮点数四则运 算方法,定点加减法器设计。

5. 指令系统:指令格式、数据类型、寻址方式、指令类型、指令系统设计与优化。

6. 处理器技术:CPU 的结构、CPU 中的寄存器组织、控制器的结构和工作原理、微程序设计技术。

三、参考书目(二)、数据结构( 75 分) 考查目标1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。

2.掌握基本的数据处理原理和方法,在此基础上能够对算法进行设计与分析。

3.能够选择合适的数据结构和方法进行问题求解。

考查内容一、 线性表(一) 线性表的定义和基本操作(二) 线性表的实现1. 顺序存储结构2. 链式存储结构 题号: 801Cache ),1. 唐朔飞编著 . 计算机组成原理(第二版) . 高等教育出版社, 20082. 白中英主编 .计算机组成原理(第四版) . 科学出版社, 20093. 蒋本珊编著 . 计算机组成原理(第二版) . 清华大学出版社, 20083.线性表的应用二、栈、队列和数组(一)栈和队列的基本概念(二)栈和队列的顺序存储结构(三)栈和队列的链式存储结构(四)栈和队列的应用(五)特殊矩阵的压缩存储三、树与二叉树(一)树的概念(二)二叉树1.二叉树的定义及其主要特征2.二叉树的顺序存储结构和链式存储结构3.二叉树的遍历4.线索二叉树的基本概念和构造5.二叉排序树6.平衡二叉树(三)树、森林1.树的存储结构2.森林与二叉树的转换3.树和森林的遍历(四)树的应用1.等价类问题2.哈夫曼树和哈夫曼编码四、图(一)图的概念(二)图的存储及基本操作1.邻接矩阵法2.邻接表法(三)图的遍历1.深度优先搜索2.广度优先搜索(四)图的基本应用及其复杂度分析1.最小(代价)生成树2.最短路径3.拓扑排序4.关键路径五、查找(一)查找的基本概念(二)顺序查找法(三)折半查找法(四)B- 树(五)散列(Hash)表及其查找(六)查找算法的分析及应用六、内部排序(一)排序的基本概念(二)插入排序1.直接插入排序2.折半插入排序3.希尔(shell)排序(三)交换排序1.冒泡排序2.快速排序(四)选择排序1.简单选择排序2.堆排序(五)归并排序1.二路归并排序(六)基数排序(七)各种内部排序算法的比较(八)内部排序算法的应用参考书从考试大纲看,所要求的知识在一般的大学数据结构教材中都已经包含,所以,选择哪本书并不是重要的事情。

数据结构试题及答案

数据结构试题及答案

数据结构试题及答案数据结构试卷(⼗⼀)⼀、选择题(30分)1.设某⽆向图有n个顶点,则该⽆向图的邻接表中有()个表头结点。

(A) 2n (B) n (C) n/2 (D) n(n-1)2.设⽆向图G中有n个顶点,则该⽆向图的最⼩⽣成树上有()条边。

(A) n (B) n-1 (C) 2n (D) 2n-13.设⼀组初始记录关键字序列为(60,80,55,40,42,85),则以第⼀个关键字45为基准⽽得到的⼀趟快速排序结果是()。

(A) 40,42,60,55,80,85 (B) 42,45,55,60,85,80(C) 42,40,55,60,80,85 (D) 42,40,60,85,55,804.()⼆叉排序树可以得到⼀个从⼩到⼤的有序序列。

(A) 先序遍历(B) 中序遍历(C) 后序遍历(D) 层次遍历5.设按照从上到下、从左到右的顺序从1开始对完全⼆叉树进⾏顺序编号,则编号为i结点的左孩⼦结点的编号为()。

(A) 2i+1 (B) 2i (C) i/2 (D) 2i-16.程序段s=i=0;do {i=i+1; s=s+i;}while(i<=n);的时间复杂度为()。

(A) O(n) (B) O(nlog2n) (C) O(n2) (D) O(n3/2)7.设带有头结点的单向循环链表的头指针变量为head,则其判空条件是()。

(A) head==0 (B) head->next==0(C) head->next==head (D) head!=08.设某棵⼆叉树的⾼度为10,则该⼆叉树上叶⼦结点最多有()。

(A) 20 (B) 256 (C) 512 (D) 10249.设⼀组初始记录关键字序列为(13,18,24,35,47,50,62,83,90,115,134),则利⽤⼆分法查找关键字90需要⽐较的关键字个数为()。

(A) 1 (B) 2 (C) 3 (D) 410.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。

链式结构上排序算法的研究

链式结构上排序算法的研究

Ke r s h i a l ; u b e s r a g r h ; n e t n s r lo i m ; h o e S r a g r h ; n lss o lo t ms y wo d :c a n tb e b b l o t l o t m i s r o o t g rt i i a h c o s O l o t m a ay i fag r h t i i
实现 ,必须先定义链表 的结点 ,可定义如下的链式结构 :
tp dfn lmt e / lm y e为 it y ee t e y ; e tp i e p/ e n 型
sr tno e tuc d
, 果 h a 指 结 点 的 nx 成 员 为 e d则 结 束循 环 / 如 ed所 et n, f p h a- nx;p结点 总是 从 链 表 的头 结 点 开 始 = ed > et/ / q p > e t/ = 一 nx; q总 是 指 向”P所 指结 点 ”的下 一 结 点 /
下 :对 于链 表 每 一 个 结 点 可 看 成 是 竖 着 排 列 的 “ 泡 ” 气 ,然 后


p=q; q=q ->ne t x;
e =p; nd
分别 从头结点 向尾节点扫 描 。在扫 描 的过 程 中时刻注 意两个 相邻元 素的顺序 ,保证前 一结点元 素 的数 据域小 于后一 节点
ls. e p o r m mi he e ag rtm son c mp e ,a d an lz e om a eo he e ag rt it.W r g a ng t s lo ih o utr n ay e P r r nc ft s lo i f hms .
(nomao n ier gC l g f a zo i nv r t L nh u7 0 7 ) Ifr t nE gne n ol e nh uCt U iesy, az o 3 0 0 i i e oL y i

七大基本排序算法

七大基本排序算法

一.七大排序算法基本属性1.稳定性KMP模糊匹配算法二叉树的建立顺序查找:哨兵设置二.七大排序算法()/jingmoxukong/p/4329079.html1.冒泡排序:冒泡排序是一种交换排序。

什么是交换排序呢?交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。

算法思想它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。

假设有一个大小为N 的无序序列。

冒泡排序就是要每趟排序过程中通过两两比较,找到第i 个小(大)的元素,将其往上排。

图-冒泡排序示例图以上图为例,演示一下冒泡排序的实际流程:假设有一个无序序列{ 4. 3. 1. 2, 5 }第一趟排序:通过两两比较,找到第一小的数值1 ,将其放在序列的第一位。

第二趟排序:通过两两比较,找到第二小的数值2 ,将其放在序列的第二位。

第三趟排序:通过两两比较,找到第三小的数值3 ,将其放在序列的第三位。

至此,所有元素已经有序,排序结束。

要将以上流程转化为代码,我们需要像机器一样去思考,不然编译器可看不懂。

假设要对一个大小为N 的无序序列进行升序排序(即从小到大)。

(1) 每趟排序过程中需要通过比较找到第i 个小的元素。

所以,我们需要一个外部循环,从数组首端(下标0) 开始,一直扫描到倒数第二个元素(即下标N - 2) ,剩下最后一个元素,必然为最大。

(2) 假设是第i 趟排序,可知,前i-1 个元素已经有序。

现在要找第i 个元素,只需从数组末端开始,扫描到第i 个元素,将它们两两比较即可。

所以,需要一个内部循环,从数组末端开始(下标N - 1),扫描到(下标i + 1)。

核心代码public void bubbleSort(int[] list) {int temp = 0; // 用来交换的临时数// 要遍历的次数for (int i = 0; i < list.length - 1; i++) {// 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上for (int j = list.length - 1; j > i; j--) {// 比较相邻的元素,如果前面的数大于后面的数,则交换if (list[j - 1] > list[j]) {temp = list[j - 1];list[j - 1] = list[j];list[j] = temp;}}}}时间复杂度若文件的初始状态是正序的,一趟扫描即可完成排序。

链式存储结构上选择排序算法的研究与实现

链式存储结构上选择排序算法的研究与实现
f o m n pq fr( i= , s【】. x;!= 1 = q n x) = P n t e q 一 ; s[]. t q e
参 考文 献
[】严蔚敏 ,吴伟 民.数据结构 [ ] 1 M .清华大学出版社 , 19 . 97 [】耿 国华 .数据结构 ( 言版 ) 【 2 c语 M】.西安 :西安 电子科
1 ) }
[]达文姣 ,任志 国 ,等 .链式 结构上 排序 算法 的研究 []. 7 J
电脑编程 与维护 ,2 1 ,() - . 0 1 3 :12
在线 性表上 的选择 排序 ,最好情况 下 的时间复杂度 是 O () n ,最差和平均情况下 的时间复杂度是 O (2,辅 助空间为 n) O () 1 ,算法一般不稳定 。在单链 表和静态链表 上的选择 排序 的时间复杂度 、空间复杂度 、稳定性与在线性 表上完全相 同。 所 以从实现过 程和算法 的分析 ,可 以很 明显 地发 现两种算 法
算 法实现描述如下 :
v i e csr s n l t N1 od S l t t( i i e o l k s S[ )
, / 静态链表上的选择排序算法

会有 多余 的结 点存 在 ,所 以数 据所 占的存储 空 间 良 费较少 。
链式结构上 的排序 只改变链 的指 向 ,而不会 改变数 据元素所 占节点 的位 置 ,即不会移 动数据元 素 ,从 而节省 了移动数据
sr c o e tu tn d
} }
) Βιβλιοθήκη 3选择排序算法在静态链表上实现
为了描述 插入排序 在静 态链表 上 的排序过程 ,定义 静态
链 表的结构 :
f ee y ed t, lmt a ;数据域 p a/ s ut o e* e t  ̄针 域 t c d nx; d r n H

全国计算机二级考试基础知识

全国计算机二级考试基础知识

1算法的基本概念1、算法一般应具有以下几个基本特征:可行性、确定性、有穷性、拥有足够的情报。

算法是对解题方案的准确而完整的描述,是一组严谨地定义运算顺序的规则,并且每一个规则都是有效和明确的,此顺序将在有限的次数下终止。

2、算法的基本要素(1)算法中对数据的运算和操作。

通常有4类:算术运算,逻辑运算,关系运算和数据传输。

(2)算法的控制结构。

算法的功能不仅仅取决于所选择的操作,还与操作之间的执行顺序及算法的控制结构有关。

3、算法设计基本方法算法设计的基本方法有列举法、归纳法和递推法、递归法和减半递推技术.4、算法的复杂度(在算法正确的前提下,评价算法的标准)(1)算法的时间复杂度算法的时间复杂度是指执行算法所需要的计算工作量。

算法的工作量用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数。

(2)算法的空间复杂度算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

一个算法所占的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间.数据结构,直接影响算法的选择和效率。

而数据结构包括两方面,即数据的逻辑结构和数据的存储结构。

数据之间的相互关系称为逻辑结构。

通常分为4类基本逻辑结构,即集合、线性结构、树形结构和图状结构或网状结构。

存储结构图是逻辑结构在存储器中的映象,它包含数据元素的映象和关系的映象。

存储结构在计算机有两种,即顺序存储结构和链式存储结构。

时间复杂度与空间复杂度之间没有必然的联系.2数据结构基本概念1、 数据结构是指反映数据元素之间的数年据元素集合的表示.2、 所谓数据的逻辑结构,是指所映数据元素之间逻辑关系的数据结构.数据的逻辑结构有两个要素:一是数据元素的集合;二是数据元素之间的关系。

3、 各数据元素在计算机存储空间中的位置关系与它们的逻辑关系不一定是相同的.数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。

数据结构试卷(十)

数据结构试卷(十)

数据结构试卷(十)一、选择题(24分)1.下列程序段的时间复杂度为()。

i=0,s=0;while (s<n) {s=s+i;i++;}(A) O(n1/2) (B) O(n1/3) (C) O(n) (D) O(n2)2.设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列()存储方式最节省运算时间。

(A) 单向链表(B) 单向循环链表(C) 双向链表(D) 双向循环链表3.设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为()。

(A) s->next=p->next;p->next=-s;(B) q->next=s; s->next=p;(C) p->next=s->next;s->next=p;(D) p->next=s;s->next=q;4.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。

(A) 5,3,4,6,1,2 (B) 3,2,5,6,4,1(C) 3,1,2,5,4,6 (D) 1,5,4,6,2,35.设有一个10阶的下三角矩阵A(包括对角线),按照从上到下、从左到右的顺序存储到连续的55个存储单元中,每个数组元素占1个字节的存储空间,则A[5][4]地址与A[0][0]的地址之差为()。

(A) 10 (B) 19 (C) 28 (D) 556.设一棵m叉树中有N1个度数为1的结点,N2个度数为2的结点,……,Nm个度数为m的结点,则该树中共有()个叶子结点。

(A) ∑=-miiNi1)1((B) ∑=miiN1(C) ∑=miiN2(D) ∑=-+miiNi2)1(17. 二叉排序树中左子树上所有结点的值均()根结点的值。

(A) < (B) > (C) = (D) !=8. 设一组权值集合W=(15,3,14,2,6,9,16,17),要求根据这些权值集合构造一棵哈夫曼树,则这棵哈夫曼树的带权路径长度为()。

数据结构专升本模拟题及参考答案.

数据结构专升本模拟题及参考答案.

作业题(一)一、单项选择题1. 从逻辑上可以把数据结构分为()两大类。

A.动态结构、静态结构 B.顺序结构、链式结构C.线性结构、非线性结构 D.初等结构、构造型结构2. 链表不具有的特点是()A.插入、删除不需要移动元素 B.可随机访问任一元素C.不必事先估计存储空间 D.所需空间与线性长度成正比3.下面程序段的时间复杂度的量级为()。

For(i=1;i<=n;i++)For(j=1;j<=I;j++)For(k=1;k<=j;k++)X=x+1;A.O(1) B.O(n)C.O(n²) D.O(n³)4.在一个带头结点的双向循环链表中,若要在p所指向的结点之前插入一个新结点,则需要相继修改()个指针域的值。

A.2 B.3C.4 D.65、一个顺序存储线性表的第一个元素的存储地址是90,每个元素的长度是2,则第6个元素的存储地址是()。

A.98 B.100C.102 D.1066、判定一个栈s(最多元素为m0)为空的条件是()。

A.s-〉top! =0 B.s-〉top= =0C.s-〉top! =m0 D.s-〉top= =m07、循环队列用数组A[m](下标从0到m-1)存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是()。

A.(rear-front+m)%m B.rear-front+1C.rear-front-1 D. rear-front8、设有两个串S1与S2,求串S2在S1中首次出现位置的运算称作()。

A.连接 B.求子串C.模式匹配 D.判子串9、设串S1='ABCDEFG',S2='PQRST',函数con(x,y)返回x和y串的连接串,subs(s,i,j)返回串S的的从序号i的字符开始的j个字符组成的子串,len(s)返回串S的长度,则con(subs(S1,2,len(S2)),subs(S1,len(S2),2))的结果是()。

知识点归并排序和基数排序

知识点归并排序和基数排序
3. 简单选择排序、堆排序和归并排序的时间性 能不随记录序列中关键字的分布而改变。
数据结构
二、空间性能 指的是排序过程中所需的辅助空间大小
1. 所有的简单排序方法(包括:直接插入、
起泡和简单选择) 和堆排序的空间复杂度为O(1);
2. 快速排序为O(logn),为递归程序执行过程中,
栈所需的辅助空间;
数据结构
容易看出,对 n 个记录进行归并排序的时间 复杂度为Ο(nlogn)。即:
每一趟归并的时间复杂度为 O(n), 总共需进行 log2n 趟。
数据结构
10.6 基 数 排 序
数据结构
基数排序是一种借助“多关键字排序” 的思想来实现“单关键字排序”的内部 排序算法。
多关键字的排序
链式基数排序
一、多关键字的排序 n 个记录的序列 { R1, R2, …,Rn} 对关键字 (Ki0, Ki1,…,Kid-1) 有序是指:
对于序列中任意两个记录 Ri 和 Rj (1≤i<j≤n) 都满足下列(词典)有序关系: (Ki0, Ki1, …,Kid-1) < (Kj0, Kj1, …,Kjd-1) 其中: K0 被称为 “最主”位关键字
数据结构
10.5 归 并 排 序(知识点三)
数据结构
归并的含义是将两个或两个以上的有序表组 合成一个新的有序表。
归并排序可分为两路归并排序,或多路归并 排序,既可用于内排序,也可用于外排序。这 里仅对内排序的两路归并方法进行讨论。
数据结构
两路归并排序算法思路:
假设初始序列含有n个记录,首先把n个记录 看成n个长度为1的有序序列,进行两两归并, 得到 n/2个长度为2的关键字有序序列, 再两两归并直到所有记录归并成一个长度为n 的有序序列为止。

可对链式存储排序的方法

可对链式存储排序的方法

可对链式存储排序的方法链式存储是一种常见的数据结构,它通过指针将数据元素按照一定的顺序链接在一起。

在某些情况下,我们需要对链式存储中的数据进行排序,以便更好地利用和管理这些数据。

本文将介绍几种可对链式存储排序的方法。

方法一:冒泡排序冒泡排序是一种简单直观的排序方法,它通过相邻元素之间的比较和交换来实现排序。

对于链式存储,可以使用两个指针分别指向当前节点和下一个节点,通过比较节点的值来确定是否需要交换位置。

重复这个过程直到链表中所有节点都按照指定的顺序排列。

方法二:插入排序插入排序是一种稳定的排序方法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

对于链式存储,可以使用一个指针指向当前节点,另一个指针指向已排序的序列。

通过比较节点的值来确定插入位置,然后将节点插入到相应位置。

方法三:选择排序选择排序是一种简单直观的排序方法,它通过每次从未排序的序列中选择最小(或最大)的元素,放到已排序序列的末尾。

对于链式存储,可以使用两个指针分别指向当前节点和最小节点,通过比较节点的值来确定最小节点,然后将最小节点与当前节点交换位置。

方法四:归并排序归并排序是一种稳定的排序方法,它通过将两个有序序列合并成一个有序序列来实现排序。

对于链式存储,可以使用递归的方式将链表分成两个子链表,然后分别对两个子链表进行排序,最后将两个有序子链表合并成一个有序链表。

方法五:快速排序快速排序是一种常用的排序方法,它通过选择一个基准元素,将序列分成左右两个子序列,然后分别对左右两个子序列进行排序。

对于链式存储,可以使用两个指针分别指向当前节点和基准节点,通过比较节点的值来确定节点的位置,然后递归地对左右两个子链表进行排序。

方法六:堆排序堆排序是一种基于二叉堆的排序方法,它通过构建最大堆或最小堆来实现排序。

对于链式存储,可以使用一个指针指向当前节点,另一个指针指向堆的根节点。

通过比较节点的值和堆的根节点的值来确定是否需要交换位置,然后递归地对剩余的节点进行堆调整,最后得到有序的链表。

排序方法

排序方法

三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表(以后谈)一、顺序查找的基本思想:从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。

很明显的缺点就是查找效率低。

适用于线性表的顺序存储结构和链式存储结构。

计算平均查找长度。

例如上表,查找1,需要1次,查找2需要2次,依次往下推,可知查找16需要16次,可以看出,我们只要将这些查找次数求和(我们初中学的,上底加下底乘以高除以2),然后除以结点数,即为平均查找长度。

设n=节点数平均查找长度=(n+1)/2二、二分法查找(折半查找)的基本思想:前提:(1)确定该区间的中点位置:mid=(low+high)/2min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中。

这时high=mid-1如果R[mid].key<a,则等于a的关键字如果存在,必然在R[mid].key右边的表中。

这时low=mid如果R[mid].key=a,则查找成功。

(3)下一次查找针对新的查找区间,重复步骤(1)和(2)(4)在查找过程中,low逐步增加,high逐步减少,如果high<low,则查找失败。

平均查找长度=Log2(n+1)-1注:虽然二分法查找的效率高,但是要将表按关键字排序。

而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。

为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。

数据结构作业答案

数据结构作业答案

1:41.如果待排序序列中两个数据元素具有相同的值,在排序后它们的位置发生颠倒,则称该排序是不稳定的。

()就是不稳定的排序方法。

1.起泡排序2.归并排序3.直接插入法排序4.简单选择排序2:8 带头结点的单链表head为空的判断条件是( )。

1.head==NULL2.head->next==NULL3. head->next==head4. head!=NULL3:9 在单链表中增加头结点的目的是为了( )。

1.方便运算的实现2.用于标识单链表3.使单链表中至少有一个结点4.用于标识起始结点的位置4:46 下列四个关键字序列中,( )不是堆。

1. {05,23,16,68,94,72,71,73}2.{05,16,23,68,94,72,71,73}3. {05,23,16,73,94,72,71,68}4.{05,23,16,68,73,71,72,94}5:20.设输入序列为1,2,3,4,5,借助一个栈可以得到的输出序列是( )。

1.2,4,1,3,52.3,4,1,5,23.3,2,4,1,54.4,1,3,2,56:50 对有n个记录的表按记录键值有序建立二叉排序树,在这种情况下,其平均查找长度的量级为()。

1.O(n)2.O(nlog2n)3.O(1)4. O(log2n)7:37.用分划交换排序方法对包含有n个关键的序列进行排序,最坏情况下执行的时间杂度为( )。

1.O(n)2. O(log2n)3.O(nlog2n)4. O(n2)8:38.邻接表的存储结构下图的深度优先遍历类似于二叉树(树)的( )。

1.先序遍历2.中序遍历3.后序遍历4.按层遍历9:48 对有n个记录的有序表采用二分查找,其平均查找长度的量级为()。

1. O(log2n)2.O(nlog2n)3.O(n)4. O(n2)10:2 线性表是具有n个( )的有限序列。

1.表元素2.字符3.数据元素4.信息项11:15 在一个单链表中,若删除(*p)结点的后继结点,则执行( )。

云南省-()专升本十套-数据结构(试题及答案)

云南省-()专升本十套-数据结构(试题及答案)

数据结构试卷(一)一、单选题(每题2 分,共20分)1.栈和队列的共同特点是( )。

A.只允许在端点处插入和删除元素B.都是先进后出C.都是先进先出D.没有共同点2.用链接方式存储的队列,在进行插入运算时( ).A. 仅修改头指针B. 头、尾指针都要修改C. 仅修改尾指针D.头、尾指针可能都要修改3.以下数据结构中哪一个是非线性结构?( )A. 队列B. 栈C. 线性表D. 二叉树4.设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进制表示。

A.688 B.678 C.692 D.6965.树最适合用来表示( )。

A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据6.二叉树的第k层的结点数最多为( ).A.2k-1 B.2K+1 C.2K-1 D. 2k-17.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为( )A. 1,2,3B. 9,5,2,3C. 9,5,3D. 9,4,2,38.对n个记录的文件进行快速排序,所需要的辅助存储空间大致为A. O(1)B. O(n)C. O(1og2n)D. O(n2)9.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K %9作为散列函数,则散列地址为1的元素有()个,A.1 B.2 C.3 D.410.设有6个结点的无向图,该图至少应有( )条边才能确保是一个连通图。

A.5B.6C.7D.8二、填空题(每空1分,共26分)1.通常从四个方面评价算法的质量:_________、_________、_________和_________。

2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示为________。

链式基数排序

链式基数排序

链式基数排序
链式基数排序是一种高效的排序算法,它可以在O(n)的时间复杂度内
完成对n个数的排序。

它的基本思想是将待排序的数按照个位、十位、百位等位数进行排序,每一位上的排序都采用桶排序的方法,最终得
到有序的数列。

链式基数排序的实现过程如下:
1. 将待排序的数按照个位数的大小放入0~9号桶中。

2. 从0号桶开始,按照顺序将桶中的数取出,放入一个新的数组中。

3. 将新数组中的数按照十位数的大小放入0~9号桶中。

4. 从0号桶开始,按照顺序将桶中的数取出,放入新数组中。

5. 重复上述过程,直到最高位排序完成。

6. 最终得到有序的数列。

链式基数排序的优点是可以处理大量数据,且不需要额外的空间,因
为它是在原数组上进行排序的。

同时,它的时间复杂度也比较低,可以在O(n)的时间内完成排序。

但是,链式基数排序也有一些缺点。

首先,它只适用于整数的排序,无法处理小数和负数。

其次,它的实现过程比较复杂,需要对桶排序和链表等数据结构有一定的了解。

总的来说,链式基数排序是一种高效的排序算法,可以在处理大量数据时发挥出它的优势。

但是,在实际应用中需要根据具体情况选择合适的排序算法,以达到最优的排序效果。

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

题目: 链式简单选择排序初始条件:理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)用户自己输入数据的个数和数据;(2)建立链表;(3)基于链表的排序算法实现。

2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字;(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、结果分析、设计体会等;(4)结束语;(5)参考文献。

时间安排:2007年7月2日-7日(第18周)7月2日查阅资料7月3日系统设计,数据结构设计,算法设计7月4日-5日编程并上机调试7月6日撰写报告7月7日验收程序,提交设计报告书。

指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日链式简单选择排序摘要:单链表为存储结构,并在这个基础上实现简单选择排序。

一趟简单选择排序的操作为:通过n-1次关键字之间的比较,从n-i+1个记录中选出最小的记录并将这个记录并入一个新的链表中,在原链表中将这个结点删除。

关键字:单链表,简单选择排序,结点,记录0. 引言《数据结构》是计算机科学与技术、软件工程及相关学科的专业基础课,也是软件设计的技术基础。

《数据结构》课程的教学要求之一是训练学生进行复杂的程序设计的技能和培养良好程序设计的风格,其重要程度决不亚于理论知识的传授,因此课程设计环节是一个至关重要的环节,是训练学生从事工程科技的基本能力,是培养创新意识和创新能力的极为重要的环节。

基本要求如下:(1) 熟练掌握基本的数据结构;(2) 熟练掌握各种算法;(3) 运用高级语言编写质量高、风格好的应用程序。

因此在这个课程设计中我选择的是链式简单选择排序。

这个实验的实验要求是利用单链表作为记录(数据)的存储结构,并且在记录好用户输入了数据之后对这组数据进行输出,然后对其进行排序,并且输出排序好的数据。

1.需求分析(1)在这个实验中的数据的存储结构要求是用单链表,不是用数组,也不是循环链表也不是循环链表。

(2)这组数据的大小(即这组数据的个数)是由用户输入的。

(3)用户输入完数据之后,程序能自动的将这些数据(记录)用单链表存储起来。

(4)用户输入完数据之后,程序要输出这些数据,以便用户查看自己是否输入错误。

(5)对用户输入的数据要自动进行排序操作。

(6)排序完了之后,程序可以自动的输出排序好的数据。

2.数据结构设计在这个程序中用的存储结构是单链表,对于单链线性表的声明和定义如下:#define datatype inttypedef struct Lnode{ datatype data;//结点的数据域struct Lnode *next;//结点的指针域} key,*keylist;其中的“datatype”为整型,其中的“*next”为指针类型,“*keylist”也是指针类型3.算法设计3.1 对于使用的算法的简单的描述在这个课程设计中,我要做的是用单链表做存储结构,将记录的数据惊醒简单选择排序,在简单选择排序的过程中不需要最小值到底是多少,而需要知道的是它在原链表中的位置i,和其前驱结点的位置。

在这个实验中需要求出位置i,这个函数中,由于在单链表中必需将每个值都比较一次,所以需要用一个变量记下最小值所在的位置就。

另外还需要找到最小值的前驱,这个就只是需要在原链表中,将指向结点的指针向后移动i-1个位置就行了。

在这个课程设计中还需要注意的是函数之间参数的传递,虽然在下面的函数中没有用return语句来返回值,但是由于在C语言中,不能由“&”(在C ++中可以使用)来返回值。

所以对于那些算法应当进行适当的改正。

否则将不能达到所需要的功能。

3.2 删除结点算法Status listDelete_b(keylist &L,int i,datatype &e){ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值P<-L;j<-0;while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前驱{ p=p->next;j++;}if(!(p->next)||j>i-1)return ERROR;//删除位置不合理q=p->next; //删除并释放结点p->next=q->next;e=q->data;free(q);return OK;}3.3 加入结点Status ListInsert_L(keylist &L, int i , datatype e){//在带头结点的单链线性表L中第i个位置之前插入元素ep=L;j=0;while(p不为空或j小于i-1) //寻找第i-1个结点{ p=p->next;++j;}if(p为空或j大于i-1)return ERROR; //i小于1或大于表长s->data=e;s->next=p->next;p->next=s;return OK;}3.4 简单选择排序算法void simplesort(keylist L, keylist &q ){ //将带头结点的单链线性表L中的数据进行简单选择排序,并且将排序好的结果用//带头结点q的单链表返回q->next=Null;r=q;while(p不为空){i=findmin(L);//在现有的元素中找到最小值在现在的链表中的位置ip=premin(L,i);//找到最小值结点的前驱结点if(p为空)reurn ERROR;u=p->next; // 将最小值从单链表L中删除结点,并入新链表q中。

p->next=u->next;u->next=r->next;r->next=u;r=u;}}3.5查找最小值算法int findmin(keylist L){//在带头结点的单链表L中找关键字最小的元素的位置,并返回其位置int k=0, i=0;datatype min=30000;keylist p;p=L;while(p不为空)//查找关键字最小的元素在单链表中的位置{ k++;if(p的值小于min){ min=p->data;i=k;}p=p->next;}return i;}3.6创建单链表算法void creatlink(keylist &L,int n){//建立一个带有头结点L的,有n个结点的单链表L->next=Null;r=L;for(i=1;i<=n;i++){ 输入q的值;//输入结点数据q->next=r->next;//将结点并入单链表L中r->next=q;r=q;}}3.7有关技术讨论在这个题目中使用的技术有:创建一个单链线性表,在单链表中找最小值的位置,在单链表中找最小值所在结点的前驱结点的地址,以及在单链表中插入和删除结点。

以下分别对它们进行说明。

3.7.1 创建一个单链线性表:首先,分配头结点;然后,每次都产生一个新的结点,并对这个新结点赋值;最后,将这个结点放在单链表的表尾。

3.7.2 在单链表中找最小值的位置:首先,在这个函数先定义一个datatype型的变量min,并将这个变量赋为最大值,并且用一个变量i来记录最小值的位置,用变量k来进行计数(用来存放当前结点是在原链表中的第几个结点);再次,用min和当前结点的关键字进行比较,如果当前结点的关键字比较小,就将min 的值赋为当前结点的关键字,并且将k的值赋给i。

一直重复这个步骤,知道最后一个结点,这样就能够找到单链表中的最小值了;最后,返回这个最小值所在的位置。

3.7.3 在单链表中找到最小值所在结点的前驱结点:首先,在这个程序中用一个keylist类型的变量“p”来记录结点的地址;再次,将指针“p”从都结点的位置向后移动i-1个位置,就能得到最小值所在结点前驱结点的位置;最后,返回这个位置。

3.7.4 在单链表中插入一个结点在这个课程设计中需要插入的位置始终是在表尾,所以用一个指针始终录表尾所在的位置就可以了。

每次都只需要在表尾插入一个结点,再修改尾的位置即可。

3.7.5 在单链表中删除一个结点首先,利用前面已经叙述的算法,找到最小值所在结点的前驱结点的位置,并下来;其次,使用一个新的keylist类型的指针,并且是它指向最小值所在的结点的地址;最后,让前驱结点的后继指向最小值所在结点的后继,这样就将这个含有最小值的结点从原链表中删除了。

这样做的原因是因为这个最小值所在的结点在从原链表中删除后并没有释放其空间,而是将它并入了新链表的表尾,所以这个结点是仍然存在的。

只是它在排序后的链表中去了。

4. 程序实现4.1 程序中函数的声明int selectminkey(key *head);/*在单链表中找到最小值的位置*/keylist premin(key *h,int j);/*找到最小值所在结点的前驱结点*/keylist createkeys(int n);/*创建有n个结点的带头结点的单链表*/4.2 主要算法代码实现4.2.1 查找最小值算法程序int selectminkey(key *head)/*在单链表中找到最小值的位置*/{ int m;/*用来记录最小值的位置*/int k=0;/*k用来记下当前结点在原链表中是第几个结点*/keylist po,min;/*用来记录最小值*/min=(keylist)malloc(sizeof(key));po=(keylist)malloc(sizeof(key));po=head->next;min->data=30000;if(po==null) return 0;m=1;while(po!=null){ k=k+1;if(po->data<min->data){ min->data=po->data;m=k;}po=po->next;}return m;/*返回最小值的位置*/}4.2.2 找最小值结点前驱结点算法程序keylist premin(key *h,int j)/*找到最小值所在结点的前驱结点*/{ int i;keylist qo;/*记录前驱结点*/qo=(keylist)malloc(sizeof(key));qo=h;for(i=1;i<j;i++){ qo=qo->next;}return qo;/*返回前驱结点*/}4.2.3 创建单链表算法程序keylist createkeys(int n)/*创建有n个结点的带头结点的单链表*/ { keylist head,rear,po;/*定义头结点,尾结点,和中间结点*/ int i;head=(keylist)malloc(sizeof(key));rear=(keylist)malloc(sizeof(key));head->next=null;rear=head;for(i=1;i<=n;i++){ printf("Please input the data %d\n",i);po=(keylist)malloc(sizeof(key));/*生成新结点*/scanf("%d",&(po->data));/*输入新结点的数据*/po->next=rear->next;/*将新结点并入链表*/rear->next=po;rear=po;}return head;}4.2.4 删除结点和加入结点算法程序main(){ int i,j,n;keylist h,p,q,ho,r;printf("\n Please input the number of the datas\n");scanf("%d",&n);h=(keylist)malloc(sizeof(key));r=(keylist)malloc(sizeof(key));p=(keylist)malloc(sizeof(key));q=(keylist)malloc(sizeof(key));ho=(keylist)malloc(sizeof(key));ho->next=null;r=ho;h=createkeys(n);/*调用创建单链表的函数,并得到其头结点*/p=h->next;printf("\n the primary datas is: ");for(i=1;i<=n;i++){ printf("%d ",p->data);p=p->next;}for(i=1;i<=n;i++)/*简单选择排序*/{ j=selectminkey(h);/*调用函数找到最小值的位置*/q=premin(h,j);/*调用函数找到最小值所在结点的前驱结点的地址*/p=q->next;q->next=p->next;p->next=r->next;r->next=p;r=p;}printf("\n the datas after sorting is: ");r=ho->next;while(r!=null)/*输出排序后的数据*/{ printf("%d ",r->data);r=r->next;}}4.3 运行结果4.3.1 计算机输出提示及用户输入数据个数4.3.2 计算机提示及用户输入20个数据4.3.4 输出原始数据4.3.5 输出排序后数据结果分析:这个实验的实验结果完全正确。

相关文档
最新文档