数据结构 选择排序

合集下载

头歌数据结构十大经典排序算法 -回复

头歌数据结构十大经典排序算法 -回复

头歌数据结构十大经典排序算法-回复什么是经典排序算法?经典排序算法是指在计算机科学领域中被广泛应用和研究的排序算法。

排序是计算机科学中的基本操作之一,它的目标是将一组元素按照某种特定的顺序进行排列。

经典排序算法通常被用来解决排序问题,可以应用于数据的排序、搜索、统计等各种计算任务中。

在这篇文章中,我们将讨论头歌数据结构中的十大经典排序算法,探索每个算法的原理和实现方法,以及它们的优缺点和适用场景。

1. 冒泡排序(Bubble sort)冒泡排序是一种简单直观的排序算法,它的基本思想是重复地交换相邻两个元素,将较大的元素逐渐“浮”到数组的尾部。

具体实现可以使用两层嵌套循环,外层循环控制比较的轮数,内层循环进行元素比较和交换。

冒泡排序的时间复杂度为O(n^2)。

2. 选择排序(Selection sort)选择排序是一种简单的选择最小元素的排序算法,它的基本思想是从头开始,逐个选择最小的元素,并将其放置到已排序部分的末尾。

具体实现可以使用两层嵌套循环,外层循环控制已排序部分的末尾位置,内层循环用于选择最小元素。

选择排序的时间复杂度为O(n^2)。

3. 插入排序(Insertion sort)插入排序是一种简单直观的排序算法,它的基本思想是将已排序部分的元素依次与未排序部分的元素进行比较并插入到正确的位置。

具体实现可以使用两层嵌套循环,外层循环控制未排序部分的元素,内层循环用于比较和插入元素。

插入排序的时间复杂度为O(n^2)。

4. 希尔排序(Shell sort)希尔排序是一种改进的插入排序算法,它的基本思想是将数组划分为若干个子序列,并分别对子序列进行插入排序,直到整个数组有序。

具体实现使用增量序列来控制子序列的划分和插入排序的间隔,最终将整个数组排序。

希尔排序的时间复杂度为O(nlogn)。

5. 归并排序(Merge sort)归并排序是一种分治法排序算法,它的基本思想是将数组分成两个子数组,分别对子数组进行递归排序,然后将排序好的子数组合并成一个有序的数组。

c24-选择排序

c24-选择排序

简单选择排序
每经过一趟比较就找出一个最小值,与待排序列最前 面的位置互换即可。
实现过程
在n个记录中选择最小者放到r[1]位置;然后,从剩余 的n-1个记录中选择最小者放到r[2]位置;…如此进行 下去,直到全部有序为止。
6
简单选择排序
优点及局限
优点:实现简单 缺点:每趟只能确定一个元素,表长为n时需要n-1 趟 前提:顺序存储结构

关键字序列T= (21,25,49,25*,16,08),请 给出简单选择排序的具体实现过程。
7
简单选择排序
原始序列: 21,25,49,25*,16,08 第1趟 第2趟 第3趟 第4趟 08,25,49,25*,16,21 08,16, 49,25*,25,21 08,16, 21,25*,25,49 08,16, 21,25*,25,49
√ (大根堆) (大顶堆) (最大堆)
堆排序
建堆过程
将关键字k1,k2,k3,…,kn表示成一棵完全二叉 树,然后从第n/2 个排序码开始筛选,使由该结 点作根结点组成的子二叉树符合堆的定义,然后从 第n/2 -1个排序码重复刚才操作,直到第一个排 序码止。

关键字序列T= (21,25,49,25*,16,08),请建 大根堆 解:为便于理解,先将原始序列画成完全二叉树的 形:这样可以很清晰地从n/2开始调整。
rc=H.r(s);
for(j=2*s;j<=m;j*=2){//沿key较大的孩子结点向下筛选 if(j<m&&LT(H.r[j].key,H.r[j+1].key)) ++j;//j为key较大 HeapAdjust是针对结点 i 的堆调整函数,其含义是: 的记录的下标 从结点i开始到堆尾为止,自上向下比较,如果子女 if(!LT(rc.key,H.r[j].key)) break;//rc应插入在位置s上 的值大于双亲结点的值,则互相交换,即把局部调整 为大根堆。 H.r[s]=H.r[j]; s=j;

天大《数据结构》学习笔记七

天大《数据结构》学习笔记七

主 题: 《数据结构》学习笔记内 容:《数据结构》学习笔记七——排序一、选择排序:1.1 思路:每次选最小者,与当前范围的第1位交换。

二、插入排序:2.1思路:当前有序集的下一个数,插入到有序集中。

三、归并排序:3.1 思路:合并两个有序集,反复执行。

四、快速排序:4.1 思路:一分为三。

4.2 举例:{49, 38 ,65 ,97 ,76 ,13 ,27 , 49}i j第一趟结束->{27,38,13}49{76,97,65,49}{13}27{38}49{49,65}76{97}49{65}4.3 主体程序:int partition(sqlist&L ,inl low, int high){L.r[0]=L.r[low];pivotkey=L.r[low].key;while(low<high){while(low<high&&L.r[high].key>=pivotkey)--high;L.r[low]=L.r[high];While(low<high)&&(L.r[low].key<=pivotkey)++low;L.r[high]=L.r[low]}L.r[low]=L.r[0];return(low);}总程序:void Quicksort (sqlist,&L){Qsort(L,1,L.length);}void Qsort(Sqlist &L; int low, int high){if(low<high){pivotloc=partition(L,low,high);Qsort(L,low,pivotloc-1);Qsort(L,pivotloc+1,high);}}五、堆排序:5.1 思路:{49,38,65,97,76,13,27,49}将此数组看成二叉树。

49 1338 65 建堆38 2797 76 13 27 49 76 65 494997堆:任何一个父结点不大于它的子结点。

数据结构 排序 历年考研练习题库 试卷及答案

数据结构 排序 历年考研练习题库 试卷及答案

数据结构排序历年考研练习题库试卷及答案数据结构排序历年考研练习题库试卷及答案一、冒泡排序冒泡排序是一种基本的排序算法,它通过重复地交换相邻两个元素的位置来实现排序。

算法的基本思想是从待排序的元素中比较相邻的两个元素大小,并根据需要交换它们的位置,直到整个序列有序为止。

冒泡排序的原理如下:首先从序列的第一个元素开始,比较相邻的两个元素的大小,若前面的元素大于后面的元素,则交换它们的位置;否则,继续比较下一对相邻元素,直到比较到序列的最后一个元素。

这样一趟比较下来,序列中最大的元素就会被交换到最后一个位置。

接着,对序列中剩下的 n-1 个元素重复上述过程,执行 n-1 趟比较,直到整个序列有序。

在实践中,冒泡排序的时间复杂度为 O(n^2),其中 n 为待排序序列的长度。

尽管冒泡排序存在其它更好的排序算法,但它具有编码简单、实现容易以及对小规模数据排序的优势。

二、选择排序选择排序也是一种简单直观的排序算法,它的思想是将待排序序列分为已排好序的部分和未排序的部分,每次选取未排序部分中最小(或最大)的元素,将其放置在已排好序的部分的末尾。

重复此过程,直到整个序列有序。

选择排序的具体步骤如下:首先从待排序序列中找到最小(或最大)的元素,然后将其与序列的第一个元素交换位置,将该元素视为已排序部分;接着,在剩下的未排序部分中找到最小(或最大)的元素,将其与第二个元素交换位置,将该元素视为已排序部分的最后一个元素;以此类推,每次选择序列中最小(或最大)的元素,并将该元素放置在已排序部分的末尾。

最终完成排序。

选择排序的时间复杂度同样为 O(n^2),其中 n 为待排序序列的长度。

相比于冒泡排序,选择排序的交换操作较少,因此在实际应用中,选择排序的性能要优于冒泡排序。

三、插入排序插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入已排好序的部分中,直到整个序列有序。

与冒泡排序和选择排序不同,插入排序是一种原地排序算法。

数据结构课程设报告—各种排序算法的比较

数据结构课程设报告—各种排序算法的比较

数据结构课程设计报告几种排序算法的演示1、需求分析:运行环境:Microsoft Visual Studio 20052、程序实现功能:3、通过用户键入的数据, 经过程序进行排序, 最后给予数据由小到大的输出。

排序的方式包含教材中所介绍的几种常用的排序方式:直接插入排序、折半插入排序、冒泡排序、快速排序、选择排序、堆排序、归并排序。

每种排序过程中均显示每一趟排序的细节。

程序的输入:输入所需排序方式的序号。

输入排序的数据的个数。

输入具体的数据元素。

程序的输出:输出排序每一趟的结果, 及最后排序结果1、设计说明:算法设计思想:a交换排序(冒泡排序、快速排序)交换排序的基本思想是: 对排序表中的数据元素按关键字进行两两比较, 如果发生逆序(即排列顺序与排序后的次序正好相反), 则两者交换位置, 直到所有数据元素都排好序为止。

b插入排序(直接插入排序、折半插入排序)插入排序的基本思想是: 每一次设法把一个数据元素插入到已经排序的部分序列的合适位置, 使得插入后的序列仍然是有序的。

开始时建立一个初始的有序序列, 它只包含一个数据元素。

然后, 从这个初始序列出发不断插入数据元素, 直到最后一个数据元素插到有序序列后, 整个排序工作就完成了。

c选择排序(简单选择排序、堆排序)选择排序的基本思想是: 第一趟在有n个数据元素的排序表中选出关键字最小的数据元素, 然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素, 依次重复, 每一趟(例如第i趟, i=1, …, n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素, 作为有序数据元素序列的第i个数据元素。

等到第n-1趟选择结束, 待排序数据元素仅剩下一个时就不用再选了, 按选出的先后次序所得到的数据元素序列即为有序序列, 排序即告完成。

d归并排序(两路归并排序)1、两路归并排序的基本思想是: 假设初始排序表有n个数据元素, 首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项), 先做两两归并, 得n/2上取整个长度为2的归并项(如果n为奇数, 则最后一个归并项的长度为1);再做两两归并, ……, 如此重复, 最后得到一个长度为n的有序序列。

数据结构C语言版_置换选择排序

数据结构C语言版_置换选择排序
&& wa[p].key < wa[q].key)
{
s=q;
q=ls[t]; /* q指示新的胜利者 */
ls[t]=s;
}
t = t/2; // 胜者继续向上跟双亲节点比较, Leabharlann p = ls[t]; }
ls[0] = q; // 最后的冠军
fread(&wa[q].rec,sizeof(RedType),1,fi);
// 如果输入文件结束,则虚设一条记录(属"rmax+1"段)
if(feof(fi))
{
wa[q].rnum = *rmax+1;
wa[q].key = MAXKEY;
}
else // 输入文件非空时
}
else
// 新读入的记录大则属当前段
wa[q].rnum = rc;
}
// 选择新的MINIMAX记录
Select_MiniMax(ls, wa, q);
}
}
/* 算法11.4 P301
在败者树ls和内存工作区wa上用置换-选择排序求初始归并段,fi为
(1,11) (3,14) (14,7) (15,9) (27,16) (30,10) (48,12) (52,13) (63,15) (89,19) (214
7483647,2)
(4,17) (13,18) (24,20) (33,23) (46,21) (58,22) (76,24) (2147483647,3)
(1,11) (48,12) (52,13) (3,14) (63,15) (27,16) (4,17) (13,18) (89,19) (24,20)

数据结构专科电子教案九

数据结构专科电子教案九

49
25
16
08
0
21 08
21
1
2
3
4 piv5ot
pivot 08 16
21 25 25 49
划分的层数等于对应二叉搜
索树的高度减1
25
区间数等于对应二叉搜索树
25 的分支结点数
49
快速排序示例所对应的二叉搜索树
31085 13586 1380 36 1356 45 4488 953 72 593
分析
快速排序中,若把每次划分所用的基 准元素看作根结点,把划分得到的左区 间和右区间看作为根结点的左子树和右 子树。那么整个排序过程就对应一棵具 有n个元素的二叉搜索树,所需划分的层 数就等于对应二叉搜索树的高度减 1 , 所需划分的所有区间数等于对应二叉搜 索树中分支结点数。
pivot
21
25
if ( k!= i-1 ) { x=A[i-1] ; A[i-1]=A[k] ; A[k]=x ; }
} }
直接选择 i =2 时选择排序的过程
08
25
49
25
16
21
5
i -1 k
j 49 25
08
25
49
i -1 k
08
25
49
i -1
25 16 21 25 25
j
25 16 21 k j 16 < 25
堆排序是不稳定的
9.3 交 换 排 序
一、气泡排序 二、快速排序
9.3.1 气 泡 排 序
Bubble Sorting
基本思想:通过相邻元素之间的比较和 交换使排序码较小的元素逐渐从底部移向 顶部,即从下标较大的单元移向下标较小 的单元。(当然,随着排序码较小的元素 逐渐上移,排序码较大的元素逐渐下移)

数据结构 排序

数据结构 排序
选择排序种类: 简单选择排序 树形选择排序 堆排序
2019/9/7
30
10.4.1 简单选择排序
待排记录序列的状态为:
有序序列R[1..i-1] 无序序列 R[i..n]
有序序列中所有记录的关键字均小于无序序列中记 录的关键字,第i趟简单选择排序是从无序序列 R[i..n]的n-i+1记录中选出关键字最小的记录加入 有序序列
2019/9/7
5
排序的类型定义
#define MAXSIZE 20 // 待排序记录的个数
typedef int KeyType;
typedef struct
{ KeyType key;
InfoType otherinfo; ∥记录其它数据域
} RecType;
typedef struct {
RecType r[MAXSIZE+1];
分别进行快速排序:[17] 28 [33] 结束 结束
[51 62] 87 [96] 51 [62] 结束
结束
快速排序后的序列: 17 28 33 51 51 62 87 96
2019/9/7
26
自测题 4 快速排序示例
对下列一组关键字 (46,58,15,45,90,18,10,62) 试写出快速排序的每一趟的排序结果

final↑ ↑first
i=8
[51 51 62 87 96 17 28 33]

final↑ ↑first
2019/9/7
14
希尔(shell )排序
基本思想:从“减小n”和“基本有序”两 方面改进。
将待排序的记录划分成几组,从而减少参 与直接插入排序的数据量,当经过几次分 组排序后,记录的排列已经基本有序,这 个时候再对所有的记录实施直接插入排序。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的记录*/ 的记录
if (i!=j) /* L.r[i]←→L.r[j]; 与第 个记录交换 与第i个记录交换 个记录交换*/ {temp=L.r[i]; L.r[i]=L.r[j]; L.r[j]=temp; } } } / * SelectSort*/
(2)算法分析 ) 在简是否有序,都需要执行n(n-1)/2次关键字的比较操作。 次关键字的比较操作。 是否有序,都需要执行 次关键字的比较操作 如果待排序的记录初始序列就是已经排好序的正列, 如果待排序的记录初始序列就是已经排好序的正列, 则无须移动记录, 则无须移动记录,因为每个元素都位于其最终位置上 而如果待排序的记录初始序列是逆序, 了;而如果待排序的记录初始序列是逆序,即在最坏 情况下,则要做3(n-1)次记录移动。所以,简单选择排 次记录移动。 情况下,则要做 次记录移动 所以, 序的时间复杂度是O(n*n)。 序的时间复杂度是 。 由上面的例1很显然看到 很显然看到, 在排序前位于 在排序前位于49*的 由上面的例 很显然看到,49在排序前位于 的 前面,而经简单选择排序后却位于49*后面了,它们的 后面了, 前面,而经简单选择排序后却位于 后面了 相对位置发生了颠倒, 相对位置发生了颠倒,因此简单选择排序算法是不稳 定排序算法。 定排序算法。
3. 堆排序
(1)堆的定义 ) 堆是一个记录序列{k1, , , ,,对于列表 堆是一个记录序列 ,k2,…,kn},,对于列表 ,, 中位置i(编号从1开始 处的记录的关键字ki, 开始) 中位置 (编号从 开始)处的记录的关键字 ,当且仅 当满足下列关系时,称之为堆。 当满足下列关系时,称之为堆。 ki≤k2i 或 ki≥k2i ki≤k2i+1 ki≥k2i+1 ( i = 1,2,…,n/2 ) , , , 其中, 其中,每个结点关键字都不小于其子孙结点关键字 的堆称为“大根堆” 的堆称为“大根堆”;而每个结点关键字都不小于其 子孙结点关键字的堆称为“小根堆” 子孙结点关键字的堆称为“小根堆”。下面的讨论中 以小根堆为例。 以小根堆为例。
选择排序(Selection sort) sort) 选择排序(
选择排序( 选择排序(Selection sort)是以选择为基础的一种 ) 常用排序方法,从记录的无序子序列中“选择” 常用排序方法,从记录的无序子序列中“选择”关键 字最小或最大的记录, 字最小或最大的记录,并将其加入到有序子序列的一 以增加记录的有序子序列的长度。 端,以增加记录的有序子序列的长度。它也有几种不 同的实现方法,这里仅介绍简单选择排序、 同的实现方法,这里仅介绍简单选择排序、树形排序 和堆排序。 和堆排序。
第二步:堆排序。这是一个反复输出堆顶元素, 第二步:堆排序。这是一个反复输出堆顶元素,将堆 尾元素移至堆顶,再调整恢复堆的过程。 尾元素移至堆顶,再调整恢复堆的过程。恢复堆的过程 与初建堆中i=1时所进行的操作完全相同 时所进行的操作完全相同。 与初建堆中 时所进行的操作完全相同。 请注意:每输出一次堆顶元素,堆尾的逻辑位置退 , 请注意:每输出一次堆顶元素,堆尾的逻辑位置退1, 直到堆中剩下一个元素为止,排序过程如图所示。 直到堆中剩下一个元素为止,排序过程如图所示。
另外,还需要设计一个主体算法,使在初建堆阶段, 另外,还需要设计一个主体算法,使在初建堆阶段, 变化到1,循环调用heap函数,而在堆排序阶 函数, 让i从[n/2]变化到 ,循环调用 从 变化到 函数 每输出一次堆顶元素,将堆尾元素移至堆顶之后, 段,每输出一次堆顶元素,将堆尾元素移至堆顶之后, 就要调用一次heap函数来恢复堆。主体算法由函数 函数来恢复堆。 就要调用一次 函数来恢复堆 Heapsort来实现: 来实现: 来实现 void Heapsort(RedType r[ ],int n){ , /* n为文件的实际记录数,r[o]没有使用 为文件的实际记录数, 没有使用*/ 为文件的实际记录数 没有使用 for(i=n/2;i>=1;i--) Heap(r,i,n); /*初建堆 初建堆*/ ;> ; ,, ; 初建堆 for(v=n; v>=2; v--) > { x=r[1]; r[1]=r[v]; r[v]=x; /*堆顶堆尾元素对换 ; 堆顶堆尾元素对换*/ 堆顶堆尾元素对换 Heap(r,1,v-1); } /*本次比上次少处理一个记录 本次比上次少处理一个记录*/ 本次比上次少处理一个记录 }/* Heapsort */
由于初始记录序列不一定满足堆关系, 由于初始记录序列不一定满足堆关系,因此堆排序 过程大体分两步处理: 过程大体分两步处理: 初建堆。从堆的定义出发,先取i=[n/2] (它一定是 ① 初建堆。从堆的定义出发,先取 它一定是 个结点双亲的编号), 结点为根的子树调整成为堆; 第n个结点双亲的编号 ,将以 结点为根的子树调整成为堆; 个结点双亲的编号 将以i结点为根的子树调整成为堆 然后令i=i-1;再将以 结点为根的子树调整成为堆。此时 结点为根的子树调整成为堆。 然后令 ;再将以i结点为根的子树调整成为堆 可能会反复调整某些结点,直到i=1为止 堆初建完成。 为止, 可能会反复调整某些结点,直到 为止,堆初建完成。 堆排序。首先输出堆顶元素(一般是最小值 一般是最小值), ② 堆排序。首先输出堆顶元素 一般是最小值 ,让堆 中最后一个元素上移到原堆顶位置,然后恢复堆, 中最后一个元素上移到原堆顶位置,然后恢复堆,因为经 过第一步输出堆顶元素的操作后, 过第一步输出堆顶元素的操作后,往往破坏了原来的堆关 所以要恢复堆;重复执行输出堆顶元素、 系,所以要恢复堆;重复执行输出堆顶元素、堆尾元素上 移和恢复堆的操作,直到全部元素输出完为止。 移和恢复堆的操作,直到全部元素输出完为止。按输出元 素的前后次序排列,就形成了有序序列, 素的前后次序排列,就形成了有序序列,完成了堆排序的 操作。 操作。
输出序列: 输出序列: 10 30 35 40 45 50 60 86
由上可知,调整恢复堆操作过程要被多次反复调用, 由上可知,调整恢复堆操作过程要被多次反复调用, 即当i值确定之后 值确定之后, 为比较参照值, 即当 值确定之后,以ki为比较参照值,与其左、右孩子 为比较参照值 与其左、 的关键字比较和调整,使以结点i为根的子树成为堆 为根的子树成为堆, 的关键字比较和调整,使以结点 为根的子树成为堆,因 此把此过程设计成函数Heap: 此把此过程设计成函数 :
设有n个记录 个记录(n= 的关键字是 的关键字是[30, , , , 例 设有 个记录 =8)的关键字是 ,50,60,35, 86,10,40,45],试用堆排序方法,将这组记录由小到 , , , ,试用堆排序方法, 大进行排序。 大进行排序。
第一步:初始建堆,其建堆过程如图所示。因为n=8,所 第一步:初始建堆,其建堆过程如图所示。因为 , 以从i=4开始。 以从 = 开始。 开始
我们已经知道,对于一棵有 个结点的完全二叉树 个结点的完全二叉树, 我们已经知道,对于一棵有n个结点的完全二叉树, 当它的结点由上而下,自左至右编号之后,编号为1~ 当它的结点由上而下,自左至右编号之后,编号为 ~ [n/2]的结点为分支结点,编号大于 的结点为分支结点, 的结点为分支结点 编号大于[n/2]的结点为叶子结 的结点为叶子结 点,对于每个编号为i的分支结点,它的左孩子的编号为 对于每个编号为 的分支结点, 的分支结点 2i,它的右孩子的编号为 ,它的右孩子的编号为2i+1。对于每个编号为 (i>1) 。对于每个编号为i( > ) 的结点,它的双亲的编号为[i/2]。 的结点,它的双亲的编号为 。 因此,我们还可以借助完全二叉树来描述堆的概念: 因此,我们还可以借助完全二叉树来描述堆的概念: 若完全二叉树中任一非叶子结点的值均小于等于(或大于 若完全二叉树中任一非叶子结点的值均小于等于 或大于 等于)其左、右孩子结点的值,则从根结点开始按结点编 等于 其左、右孩子结点的值, 其左 号排列所得的结点序列就是一个堆。 号排列所得的结点序列就是一个堆。
1. 简单选择排序
(1)算法描述 ) 简单选择排序算法的基本思路: 简单选择排序算法的基本思路:对于一组关键字 (Kl,K2,…,Kn),将其由小到大进行排序 首先从 , 首先从Kl, , , , ,将其由小到大进行排序,首先从 K2,…,Kn中选择最小值,假设是 ,则将 与K1 中选择最小值, , , 中选择最小值 假设是Kk,则将Kk与 对换;然后从K2, , , 中选择最小值 中选择最小值Kk+1, 对换;然后从 ,K3,…,Kn中选择最小值 , 再将Kk+1与K2对换。如此进行选择和调换,对第 趟 对换。 再将 与 对换 如此进行选择和调换,对第i趟 选择排序,进行n-i次关键字比较 次关键字比较, 选择排序,进行 次关键字比较,从n-i+1个记录中选 个记录中选 出关键字最小的记录,并与第i个记录交换 个记录交换。 从 至 出关键字最小的记录,并与第 个记录交换。令i从1至 n-1,进行 趟选择排序,一个由小到大的有序序列就 趟选择排序, ,进行n-1趟选择排序 形成了。 形成了。
void Heap(RedType r[ ],int i,int m){ , , /*i是根结点编号,m是以 结点为根的子树的最后一个结点编号 是根结点编号, 是以 结点为根的子树的最后一个结点编号*/ 是以i结点为根的子树的最后一个结点编号 是根结点编号 x=r[i];j=2*i;/* x保存根记录的内容,j为左孩子编号 保存根记录的内容, 为左孩子编号*/ ; ; 保存根记录的内容 为左孩子编号 while (j<=m){ if ( j<m&&r[j].key>r[j+1].key) < . > . j++; /* 当结点 有左、右两个孩子时,j取关键字值较小的 当结点i有左 右两个孩子时, 取关键字值较小的 有左、 ; 孩子结点编号*/ 孩子结点编号 if ( r[j]. key<x. key) < {r[i]=r[j];i=j;j=2*i;} /*向下一层探测 向下一层探测*/ ; ; ; 向下一层探测 else j=m+1; } ; /*x. key小于左、右孩于的关键字,强制使 >m,以便结束循环 小于左、 小于左 右孩于的关键字,强制使j> ,以便结束循环*/ r[i]=x; ; } /* Heap */
相关文档
最新文档