河北石家庄网站,陆良县住房和城乡建设局网站,广告设计公司标语,成都网站建设公司司查找排序
顺序查找也称线性查找#xff0c;它对顺序表和链表都是适用的。对于顺序表#xff0c;可通过数组下标递增来顺序扫描每个元素#xff1b;对于链表#xff0c;可通过指针next来依次扫描每个元素 \begin{aligned} \text{顺序查找也称线性查找#xff0c;它对顺…查找排序顺序查找也称线性查找它对顺序表和链表都是适用的。对于顺序表可通过数组下标递增来顺序扫描每个元素对于链表可通过指针next来依次扫描每个元素 \begin{aligned} \text{顺序查找也称线性查找它对顺序表和链表都是适用的。对于顺序表}\\可通过数组下标递增来顺序扫描每个元素对于链表可通过指针 next 来依次扫描每个元素 \end{aligned}顺序查找也称线性查找它对顺序表和链表都是适用的。对于顺序表可通过数组下标递增来顺序扫描每个元素对于链表可通过指针next来依次扫描每个元素平衡二叉树: 保证任意节点的左右子树高度差不超过 1 \begin{aligned} \color{red}\textbf{平衡二叉树}: \ \text{保证任意节点的左右子树高度差不超过 1} \end{aligned}平衡二叉树:保证任意节点的左右子树高度差不超过1概念:∙ 随机访问: 直接访问数据结构中的任意位置, 不需要按照顺序逐个访问。∙ 顺序访问: 按照特定的顺序依次访问, 时间与位置有关。折半查找的需要: 快速找到中位数、快速去掉一半元素因此使用折半查找的前提:1. 有序;2. 支持高效的随机访问, O(1) 时间内读 \begin{aligned} \textbf{概念:} \\ \quad \bullet \ \text{随机访问: 直接访问数据结构中的任意位置, 不需要按照顺序逐个访问。} \\ \quad \bullet \ \text{顺序访问: 按照特定的顺序依次访问, 时间与位置有关。} \\ \\ \text{折半查找的需要: 快速找到中位数、快速去掉一半元素} \\ \color{orange}\text{因此使用折半查找的前提:} \\ \color{orange}\quad 1. \ \text{有序;} \\ \color{orange}\quad 2. \ \text{支持高效的随机访问, } O(1) \text{ 时间内读} \end{aligned}概念:∙随机访问:直接访问数据结构中的任意位置,不需要按照顺序逐个访问。∙顺序访问:按照特定的顺序依次访问,时间与位置有关。折半查找的需要:快速找到中位数、快速去掉一半元素因此使用折半查找的前提:1.有序;2.支持高效的随机访问,O(1)时间内读链表顺序表静态链表插入/删除O(1)O(n)O(1)读/写第 x个元素O(n)O(1)O(n) \begin{array}{c|c|c|c} \hline \text{链表} \text{顺序表} \text{静态链表} \\ \hline \text{插入/删除} O(1) O(n) O(1) \\ \hline \text{读/写第} \ x \text{个元素} O(n) O(1) O(n) \\ \hline \end{array}插入/删除读/写第x个元素链表O(1)O(n)顺序表O(n)O(1)静态链表O(1)O(n)5个结点的二叉树总共有多少种不同的形状卡特兰数(1n1C2nn){1. n个元素入栈有多少种不同的出栈序列2. n个结点的二叉树总共有多少种不同的形态 \begin{aligned} \text{5个结点的二叉树总共有多少种不同的形状} \\ \\ \color{blue}\text{卡特兰数}\left( \frac{1}{n1}C_{2n}^{n}\right) \begin{cases} \color{red}\text{1. } n\text{个元素入栈有多少种不同的出栈序列} \\ \color{red}\text{2. } n\text{个结点的二叉树总共有多少种不同的形态} \end{cases} \end{aligned}5个结点的二叉树总共有多少种不同的形状卡特兰数(n11C2nn){1.n个元素入栈有多少种不同的出栈序列2.n个结点的二叉树总共有多少种不同的形态nhnh−2nh−11nh:高度为h的平衡二叉树最少含有的结点数 \begin{aligned} \color{red} n_h n_{h-2} n_{h-1} 1 \\ \\ \color{red} n_h: \text{高度为}h\text{的平衡二叉树最少含有的结点数} \end{aligned}nhnh−2nh−11nh:高度为h的平衡二叉树最少含有的结点数将一个有序的关键字序列插入到一个初始为空的平衡二叉树中若关键字个数 n2h−1则这一颗AVL树一定是一颗满二叉树 \begin{aligned} \text{将一个有序的关键字序列插入到一个初始为空的平衡二叉树中若关键字个数 } n 2^h - 1 \\ \text{则这一颗AVL树一定是一颗满二叉树} \end{aligned}将一个有序的关键字序列插入到一个初始为空的平衡二叉树中若关键字个数n2h−1则这一颗AVL树一定是一颗满二叉树平衡二叉树与红黑树比较{① 它们都是特殊的二叉排序树是自平衡的即在插入和删除节点时会自动调整树的结构无需手动干预② 它们的树高都是O(logn)级别树的高度可以视为最坏情况下查找所需时间的近似③ 平衡二叉树AVL对平衡的要求最高即平衡因子只能为−1、0、1。平衡二叉树的树高一般比红黑树低但插入和删除旋转调整的次数更多④ 虽然红黑树和平衡二叉树的树高的都是O(logn)的量级但是平衡二叉树的高度一般是小于红黑树的树高的因此查找速度快于红黑树结论2有n个内部结点的红黑树的高度h≤2log2(n1)。证明由结论1可知从根到叶结点不含叶结点的任何一条简单路径上都至少有一半是黑结点因此根的黑高至少为h/2于是有n≥2h/2−1即可求得结论。结论1从根结点到叶结点的最长路径不大于最短路径的2倍 \begin{aligned} \textbf{平衡二叉树与红黑树比较} \begin{cases} ① \ \text{它们都是特殊的二叉排序树是自平衡的即在插入和删除节点时会自动调整树的结构无需手动干预} \\ ② \ \text{它们的树高都是} O(\text{log}n) \text{级别树的高度可以视为最坏情况下查找所需时间的近似} \\ ③ \ \text{平衡二叉树AVL对平衡的要求最高即平衡因子只能为}-1、0、1 \text{。平衡二叉树的树高一般比红黑树低但插入和删除旋转调整的次数更多} \\ ④ \ \text{虽然红黑树和平衡二叉树的树高的都是} O(\text{log}n) \text{的量级但是平衡二叉树的高度一般是小于红黑树的树高的因此查找速度快于红黑树} \end{cases} \\ \\ \text{结论2有} n \text{个内部结点的红黑树的高度} h \leq 2\log_2(n 1) \text{。} \\ \text{证明由结论1可知从根到叶结点不含叶结点的任何一条简单路径上都至少有一半是黑结点因此根的黑高至少为} h/2 \text{于是有} n \geq 2^{h/2} - 1 \text{即可求得结论。} \\ \\ \color{red}\textbf{结论1从根结点到叶结点的最长路径不大于最短路径的2倍} \end{aligned}平衡二叉树与红黑树比较⎩⎨⎧①它们都是特殊的二叉排序树是自平衡的即在插入和删除节点时会自动调整树的结构无需手动干预②它们的树高都是O(logn)级别树的高度可以视为最坏情况下查找所需时间的近似③平衡二叉树AVL对平衡的要求最高即平衡因子只能为−1、0、1。平衡二叉树的树高一般比红黑树低但插入和删除旋转调整的次数更多④虽然红黑树和平衡二叉树的树高的都是O(logn)的量级但是平衡二叉树的高度一般是小于红黑树的树高的因此查找速度快于红黑树结论2有n个内部结点的红黑树的高度h≤2log2(n1)。证明由结论1可知从根到叶结点不含叶结点的任何一条简单路径上都至少有一半是黑结点因此根的黑高至少为h/2于是有n≥2h/2−1即可求得结论。结论1从根结点到叶结点的最长路径不大于最短路径的2倍左根右根叶黑不红红黑路同 \begin{aligned} \color{red}\text{左根右} \quad \color{red}\text{根叶黑} \\ \color{red}\text{不红红} \quad \color{red}\text{黑路同} \end{aligned}左根右根叶黑不红红黑路同B树的定义和特点一棵m阶B树或为空树或为满足如下特性的m叉树1) 树中每个结点至多有m棵子树即至多有m−1个关键字。2) 若根结点不是叶结点则至少有2棵子树即至少有1个关键字。3) 除根结点外的所有非叶结点至少有⌈m/2⌉棵子树即至少有⌈m/2⌉−1个关键字。4) 所有非叶结点的结构如下nP0K1P1K2P2⋯KnPn其中Ki (i1,2,⋯ ,n)为结点的关键字且满足K1K2⋯KnPi (i0,1,⋯ ,n)为指向子树根结点的指针且指针Pi−1所指子树中所有结点的关键字均小于Ki,Pi所指子树中所有结点的关键字均大于Kin (⌈m/2⌉−1≤n≤m−1)为结点中关键字的个数。5) 所有的叶结点都出现在同一层次上并且不带信息可以视为外部结点或类似于折半查找判定树的失败结点实际上这些结点并不存在指向这些结点的指针为空 \begin{aligned} \textbf{B树的定义和特点} \\ \text{一棵} m \text{阶B树或为空树或为满足如下特性的} m \text{叉树} \\ 1) \ \text{树中每个结点至多有} m \text{棵子树即至多有} m-1 \text{个关键字。} \\ 2) \ \text{若根结点不是叶结点则至少有2棵子树即至少有1个关键字。} \\ 3) \ \text{除根结点外的所有非叶结点至少有} \lceil m/2 \rceil \text{棵子树即至少有} \lceil m/2 \rceil - 1 \text{个关键字。} \\ 4) \ \text{所有非叶结点的结构如下} \\ \quad \begin{array}{|c|c|c|c|c|c|c|c|c|} \hline n P_0 K_1 P_1 K_2 P_2 \cdots K_n P_n \\ \hline \end{array} \\ \quad \text{其中} K_i \ (i1,2,\cdots,n) \text{为结点的关键字且满足} K_1 K_2 \cdots K_n \\ \quad P_i \ (i0,1,\cdots,n) \text{为指向子树根结点的指针且指针} P_{i-1} \text{所指子树中所有结点的关键字均小于} K_i, \\ \quad P_i \text{所指子树中所有结点的关键字均大于} K_i \\ \quad n \ (\lceil m/2 \rceil - 1 \leq n \leq m-1) \text{为结点中关键字的个数。} \\ 5) \ \text{所有的叶结点}\text{都出现在同一层次上并且不带信息可以视为外部结点或类似于折半查找判定树的失败结点}\\实际上这些结点并不存在指向这些结点的指针为空 \end{aligned}B树的定义和特点一棵m阶B树或为空树或为满足如下特性的m叉树1)树中每个结点至多有m棵子树即至多有m−1个关键字。2)若根结点不是叶结点则至少有2棵子树即至少有1个关键字。3)除根结点外的所有非叶结点至少有⌈m/2⌉棵子树即至少有⌈m/2⌉−1个关键字。4)所有非叶结点的结构如下nP0K1P1K2P2⋯KnPn其中Ki(i1,2,⋯,n)为结点的关键字且满足K1K2⋯KnPi(i0,1,⋯,n)为指向子树根结点的指针且指针Pi−1所指子树中所有结点的关键字均小于Ki,Pi所指子树中所有结点的关键字均大于Kin(⌈m/2⌉−1≤n≤m−1)为结点中关键字的个数。5)所有的叶结点都出现在同一层次上并且不带信息可以视为外部结点或类似于折半查找判定树的失败结点实际上这些结点并不存在指向这些结点的指针为空最大高度→每个结点关键字个数最少最小高度→每个结点关键字个数最多B树的高度默认情况下不含叶结点这一层根 [1,m−1][1,4]非根 [⌈m2⌉−1,m−1][2,4] \begin{aligned} \text{最大高度} \rightarrow \text{每个结点关键字个数最少} \\ \text{最小高度} \rightarrow \text{每个结点关键字个数最多} \\ \\ \color{blue}\text{B树的高度默认情况下不含叶结点这一层} \\ \\ \color{red}\text{根} \ \ [1, m-1] [1,4] \\ \color{red}\text{非根} \ \ \left[ \lceil \frac{m}{2} \rceil - 1, m-1 \right] [2,4] \end{aligned}最大高度→每个结点关键字个数最少最小高度→每个结点关键字个数最多B树的高度默认情况下不含叶结点这一层根[1,m−1][1,4]非根[⌈2m⌉−1,m−1][2,4]m阶B树与m阶B树的主要差异如下:1) 在B树中具有n个关键字的结点只含有n棵子树即每个关键字对应一棵子树而在B树中具有n个关键字的结点含有n1棵子树。2) 在B树中每个结点非根内部结点的关键字个数n的范围是⌈m/2⌉≤n≤m (非叶根结点:2≤n≤m)而在B树中,每个结点(非根内部结点)的关键字个数n的范围是⌈m/2⌉−1≤n≤m−1 (根结点:1≤n≤m−1)。3) 在B树中叶结点包含了全部关键字非叶结点中出现的关键字也会出现在叶结点中而在B树中最外层的终端结点包含的关键字和其他结点包含的关键字是不重复的。 \begin{aligned} \boldsymbol{m} \text{阶B树与} \boldsymbol{m} \text{阶B树的主要差异如下:} \\ 1) \ \text{在B树中具有} n \text{个关键字的结点只含有} n \text{棵子树} \\即每个关键字对应一棵子树而在B树中具有n \text{个关键字的结点含有} n1 \text{棵子树。} \\ 2) \ \text{在B树中每个结点}非根内部结点的关键字个数 n \text{的范围是} \lceil m/2 \rceil \leq n \leq m \ \\(\text{非叶根结点:} 2 \leq n \leq m)\text{而在B树中,每个结点}\\(非根内部结点)的关键字个数 n \text{的范围是} \lceil m/2 \rceil - 1 \leq n \leq m-1 \ (\text{根结点:} 1 \leq n \leq m-1)。 \\ 3) \ \text{在B树中叶结点包含了全部关键字非叶结点中出现的关键字也会出现在叶结点中}\\ 而在B树中最外层的终端结点包含的关键字和其他结点包含的关键字是不重复的。\end{aligned}m阶B树与m阶B树的主要差异如下:1)在B树中具有n个关键字的结点只含有n棵子树即每个关键字对应一棵子树而在B树中具有n个关键字的结点含有n1棵子树。2)在B树中每个结点非根内部结点的关键字个数n的范围是⌈m/2⌉≤n≤m(非叶根结点:2≤n≤m)而在B树中,每个结点(非根内部结点)的关键字个数n的范围是⌈m/2⌉−1≤n≤m−1(根结点:1≤n≤m−1)。3)在B树中叶结点包含了全部关键字非叶结点中出现的关键字也会出现在叶结点中而在B树中最外层的终端结点包含的关键字和其他结点包含的关键字是不重复的。4) 在B树中叶结点包含信息所有非叶结点仅起索引作用非叶结点的每个索引项只含有对应子树的最大关键字和指向该子树的指针不含有对应记录的存储地址。这样能使一个磁盘块存储更多的关键字使得磁盘读/写次数更少查找速度更快。5) 在B树中用一个指针指向关键字最小的叶结点将所有叶结点串成一个线性链表。 \begin{aligned} 4) \ \text{在B树中叶结点包含信息所有非叶结点仅起索引作用非叶结点的每个索引项}\\只含有对应子树的最大关键字和指向该子树的指针不含有对应记录的存储地址。\\这样能使一个磁盘块存储更多的关键字使得磁盘读/写次数更少查找速度更快。 \\ 5) \ \text{在B树中用一个指针指向关键字最小的叶结点将所有叶结点串成一个线性链表。} \end{aligned}4)在B树中叶结点包含信息所有非叶结点仅起索引作用非叶结点的每个索引项只含有对应子树的最大关键字和指向该子树的指针不含有对应记录的存储地址。这样能使一个磁盘块存储更多的关键字使得磁盘读/写次数更少查找速度更快。5)在B树中用一个指针指向关键字最小的叶结点将所有叶结点串成一个线性链表。散列表也称哈希表根据关键字而直接进行访问的数据结构。也就是说散列表建立了关键字和存储地址之间的一种直接映射关系。 \begin{aligned} \text{散列表也称哈希表根据关键字而直接进行访问的数据结构。也就是说散列表建立了} \\ \text{关键字和存储地址之间的一种直接}\text{映射}\text{关系。} \end{aligned}散列表也称哈希表根据关键字而直接进行访问的数据结构。也就是说散列表建立了关键字和存储地址之间的一种直接映射关系。2) 散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。装填因子。散列表的装填因子一般记为α,定义为一个表的装满程度即α表中记录数n散列表长度m散列函数可能会把两个或两个以上的不同关键字映射到同一地址称这种情况为冲突2) 散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。 \begin{aligned} 2) \ \text{散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。} \\ \text{装填因子。散列表的装填因子一般记为} \alpha, \text{定义为一个表的装满程度即} \\ \quad \alpha \frac{\text{表中记录数}n}{\text{散列表长度}m} \\ \\ \text{散列函数可能会把两个或两个以上的不同关键字映射到同一地址称这种情况为冲突} \\ \\ 2) \ \text{散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。} \end{aligned}2)散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。装填因子。散列表的装填因子一般记为α,定义为一个表的装满程度即α散列表长度m表中记录数n散列函数可能会把两个或两个以上的不同关键字映射到同一地址称这种情况为冲突2)散列表的查找效率取决于三个因素散列函数、处理冲突的方法和装填因子。1) 线性探测法也称线性探测再散列法。di1,2,⋯ ,m−1。它的特点是冲突发生时顺序查看表中下一单元探测到表尾地址m−1时下一个探测地址是表首地址0直到找出一个空闲单元当表未填满时一定能找到一个空闲单元或查遍全表。线性探测法可能使第i个散列地址的同义词存入第i1个散列地址这样本应存入第i1个散列地址的元素就争夺第i2个散列地址的元素的地址……从而造成大量元素在相邻的散列地址上聚集或堆积起来大大降低了查找效率。2) 平方探测法也称二次探测法。di12,−12,22,−22,⋯ ,k2,−k2其中k≤m/2散列表长度m必须是一个可以表示成4k3的素数。平方探测法是一种处理冲突的较好方法可以避免出现“堆积”问题它的缺点是不能探测到散列表上的所有单元但至少能探测到一半单元。3) 双散列法。dii×Hash2(key)。需要使用两个散列函数当通过第一个散列函数H(key)得到的地址发生冲突时则利用第二个散列函数Hash2(key)计算该关键字的地址增量。它的具体散列函数形式如下Hi(H(key)i×Hash2(key))%m初始探测位置H0H(key)%m。i是冲突的次数初始为0。4) 伪随机序列法。di伪随机序列。 \begin{aligned} 1) \ \text{线性探测法也称线性探测再散列法。} d_i1,2,\cdots,m-1 \text{。它的特点是} \\冲突发生时顺序查看表中下一单元探测到表尾地址m-1 \text{时下一个探测地址是表首地址0} \\直到找出一个空闲单元当表未填满时一定能找到一个空闲单元或查遍全表。\\ \quad \text{线性探测法可能使第} i \text{个散列地址的同义词存入第}\\ i1 \text{个散列地址这样本应存入第} i1 \text{个散列地址的元素就争夺第} i2 \text{个散列地址的元素的地址……} \\从而造成大量元素在相邻的散列地址上聚集或堆积起来大大降低了查找效率。\\ \\ 2) \ \text{平方探测法也称二次探测法。} d_i1^2,-1^2,2^2,-2^2,\cdots,k^2,-k^2 \text{其中} k \leq m/2 \\\text{散列表长度} m \text{必须是一个可以表示成} 4k3 \text{的素数。} \\ \quad \text{平方探测法是一种处理冲突的较好方法可以避免出现“堆积”问题} \\它的缺点是不能探测到散列表上的所有单元但至少能探测到一半单元。\\ \\ 3) \ \text{双散列法。} d_ii \times \text{Hash}_2(\text{key}) \text{。需要使用两个散列函数当通过第一个散列函数} H(\text{key})\\ \text{得到的地址发生冲突时则利用第二个散列函数} \text{Hash}_2(\text{key}) \text{计算该关键字的地址增量。它的具体散列函数形式如下} \\ \quad \quad H_i(H(\text{key}) i \times \text{Hash}_2(\text{key})) \% m \\ \quad \text{初始探测位置} H_0H(\text{key}) \% m \text{。} i \text{是冲突的次数初始为0。} \\ \\ 4) \ \text{伪随机序列法。} d_i\text{伪随机序列。} \end{aligned}1)线性探测法也称线性探测再散列法。di1,2,⋯,m−1。它的特点是冲突发生时顺序查看表中下一单元探测到表尾地址m−1时下一个探测地址是表首地址0直到找出一个空闲单元当表未填满时一定能找到一个空闲单元或查遍全表。线性探测法可能使第i个散列地址的同义词存入第i1个散列地址这样本应存入第i1个散列地址的元素就争夺第i2个散列地址的元素的地址……从而造成大量元素在相邻的散列地址上聚集或堆积起来大大降低了查找效率。2)平方探测法也称二次探测法。di12,−12,22,−22,⋯,k2,−k2其中k≤m/2散列表长度m必须是一个可以表示成4k3的素数。平方探测法是一种处理冲突的较好方法可以避免出现“堆积”问题它的缺点是不能探测到散列表上的所有单元但至少能探测到一半单元。3)双散列法。dii×Hash2(key)。需要使用两个散列函数当通过第一个散列函数H(key)得到的地址发生冲突时则利用第二个散列函数Hash2(key)计算该关键字的地址增量。它的具体散列函数形式如下Hi(H(key)i×Hash2(key))%m初始探测位置H0H(key)%m。i是冲突的次数初始为0。4)伪随机序列法。di伪随机序列。存储效率 (空间利用率)元素占有的空间整个散列表占据的空间 \begin{aligned} \text{存储效率} \ (\text{空间利用率}) \frac{\text{元素占有的空间}}{\text{整个散列表占据的空间}} \end{aligned}存储效率(空间利用率)整个散列表占据的空间元素占有的空间装的元素越多填装因子越多平均查找长度一般会增加散列函数、冲突解决策略安排得越好越合理平均查找长度越少 \begin{aligned} \text{装的元素越多}\text{填装因子}\text{越多平均查找长度一般会增加} \\ \text{散列函数、冲突解决策略}\text{安排得越好越合理平均查找长度越少} \end{aligned}装的元素越多填装因子越多平均查找长度一般会增加散列函数、冲突解决策略安排得越好越合理平均查找长度越少散列表平均查找次数的计算假设H(key)key%m、表长度为n、已存关键字数为k。① 计算ASL成功时考虑散列表中存储的每个关键字将查找到每个关键字需要的次数求和再除以k② 计算ASL失败时考虑映射到数组的所有可能位置即%m0,1,2,…,m−1共m种情况把每种失败情况的查找次数求和再除以m。 \begin{aligned} \text{散列表平均查找次数的计算假设} H(\text{key})\text{key}\%m \text{、表长度为} n \text{、已存关键字数为} k \text{。} \\ ① \ \text{计算} \text{ASL}_{\text{成功}} \text{时考虑散列表中存储的每个关键字将查找到每个关键字需要的次数求和再除以} k \\ ② \ \text{计算} \text{ASL}_{\text{失败}} \text{时考虑映射到数组的所有可能位置即} \%m0,1,2,\dots,m-1 \text{共} m \text{种情况把每种失败情况的查找次数求和再除以} m \text{。} \end{aligned}散列表平均查找次数的计算假设H(key)key%m、表长度为n、已存关键字数为k。①计算ASL成功时考虑散列表中存储的每个关键字将查找到每个关键字需要的次数求和再除以k②计算ASL失败时考虑映射到数组的所有可能位置即%m0,1,2,…,m−1共m种情况把每种失败情况的查找次数求和再除以m。直接插入排序{最好情况→元素基本有序最坏情况→元素逆序 \begin{aligned} \color{red}\text{直接插入排序} \begin{cases} \color{red}\text{最好情况} \rightarrow \color{blue}\text{元素基本有序} \\ \color{red}\text{最坏情况} \rightarrow \color{blue}\text{元素逆序} \end{cases} \end{aligned}直接插入排序{最好情况→元素基本有序最坏情况→元素逆序前面介绍过的排序算法都是在内存中进行的称为内部排序。而在许多应用中经常需要对大文件进行排序因为文件中的记录很多无法将整个文件复制进内存中进行排序。因此需要将待排序的记录存储在外存上排序时再把数据一部分一部分地调入内存进行排序在排序过程中需要多次进行内存和外存之间的交换。这种排序算法就称为外部排序。 \begin{aligned} \text{前面介绍过的排序算法都是在内存中进行的称为内部排序。而在许多应用中}\\经常需要对大文件进行排序因为文件中的记录很多无法将整个文件复制进内存中进行排序。\\因此需要将待排序的记录存储在外存上排序时再把数据一部分一部分地调入内存进行排序 \\ \text{在排序过程中需要多次进行内存和外存之间的交换。这种排序算法就称为外部排序。} \end{aligned}前面介绍过的排序算法都是在内存中进行的称为内部排序。而在许多应用中经常需要对大文件进行排序因为文件中的记录很多无法将整个文件复制进内存中进行排序。因此需要将待排序的记录存储在外存上排序时再把数据一部分一部分地调入内存进行排序在排序过程中需要多次进行内存和外存之间的交换。这种排序算法就称为外部排序。外部排序{① 从外存读入数据进行内部排序得到有序初始归并段优化思路减少有序初始归并段数量→置换选择排序② 对这些归并段进行逐趟归并优化思路增大归并趟数而不影响内部归并的比较次数 \begin{aligned} \text{外部排序} \begin{cases} ① \ \text{从外存读入数据进行内部排序得到有序初始归并段} \\ \quad \text{优化思路减少有序初始归并段数量} \rightarrow{} \text{置换选择排序} \\ \\ ② \ \text{对这些归并段进行逐趟归并}\\ \quad \text{优化思路增大归并趟数而不影响内部归并的比较次数} \end{cases} \end{aligned}外部排序⎩⎨⎧①从外存读入数据进行内部排序得到有序初始归并段优化思路减少有序初始归并段数量→置换选择排序②对这些归并段进行逐趟归并优化思路增大归并趟数而不影响内部归并的比较次数归并多个升降序序列:1. 设置多个指针指向每个序列的第一个元素。2. 重复如下步骤直到只剩一个序列未处理完: 将其中较小或较大的一方加入到结果序列中并将对应的指针向后移动一位。3. 将原序列中还未处理完序列的所有元素依次加入结果序列。归并前的序列和归并后的序列升降是相同的。外部排序:∙ 败者树中每个非终端节点表示其左、右孩子节点中的“败者”。∙ 通过冠军选出的关键字在结果序列前面因此:∙ 如果结果是升序则冠军选出的是当前最小关键字∙ 如果结果是降序则冠军选出的是当前最大关键字 \begin{aligned} \text{归并多个升降序序列:} \\ 1. \ \text{设置多个指针指向每个序列的第一个元素。} \\ 2. \ \text{重复如下步骤直到只剩一个序列未处理完: 将其中较小或较大的一方加入到结果序列中并将对应的指针向后移动一位。} \\ 3. \ \text{将原序列中还未处理完序列的所有元素依次加入结果序列。} \\ \color{orange}\text{归并前的序列和归并后的序列升降是相同的。} \\ \\ \text{外部排序:} \\ \bullet \ \text{败者树中每个非终端节点表示其左、右孩子节点中的“败者”。} \\ \bullet \ \text{通过冠军选出的关键字在结果序列前面因此:} \\ \quad \bullet \ \text{如果结果是升序则冠军选出的是当前最小关键字} \\ \quad \bullet \ \text{如果结果是降序则冠军选出的是当前最大关键字} \end{aligned}归并多个升降序序列:1.设置多个指针指向每个序列的第一个元素。2.重复如下步骤直到只剩一个序列未处理完:将其中较小或较大的一方加入到结果序列中并将对应的指针向后移动一位。3.将原序列中还未处理完序列的所有元素依次加入结果序列。归并前的序列和归并后的序列升降是相同的。外部排序:∙败者树中每个非终端节点表示其左、右孩子节点中的“败者”。∙通过冠军选出的关键字在结果序列前面因此:∙如果结果是升序则冠军选出的是当前最小关键字∙如果结果是降序则冠军选出的是当前最大关键字