选择题
[2024年第2题]. 以下排序方法中,( )不需要进行关键字的比较。
A. 基数排序 B. 归并排序 C. 快速排序 D. 堆排序
[2023年第9题]. 不能保证每趟排序至少能将一个元素放到其最终位置上的排序方法是()。
A. 插入排序 B. 快速排序 C. 冒泡排序 D. 堆排序
[2023年第10题]. 下列几种排序方法中,( )是稳定的排序方法。
A. 堆排序、冒泡排序 B. 快速排序、堆排序
C.希尔排序、归并排序 D. 归并排序、冒泡排序
[2021年第17题]. 从未排序序列中依次取出元素与已排序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的排序方法称为()。
A.插入排序 B.冒泡排序 C.选择排序 D.归并排序
[2021年第18题]. 快速排序法在( )情况下最有利于发挥其长处。
A.待排序数据量大 B.数据中含有多个相同的关键字
C.数据按关键字已基本有序 D.数据按关键字完全无序
[2021年第19题]. 下列排序算法中,占用辅助空间最多的是( )。
A.希尔排序 B.快速排序 C.堆排序 D.归并排序
[2021年第20题]. 下列排序方法中,其中( )是稳定的。
A.堆排序,冒泡排序 B.快速排序,堆排序
C.选择排序,归并排序 D.归并排序,冒泡排序
[2020年第10题]. 对一组数据(2,12,16,88,5,10)进行排序,若前三趟排序结果如下: 第一趟排序结果:2,12,16,88,5,10 第二趟排序结果:2,5,16,88,12,10 第三趟排序结果:2,5,10,88,12,16 则采用的排序方法可能________
A.希尔排序 B. 快速排序 C. 简单选择排序 D.直接插入排序
[2019年第9题]. 对一组数据(2,12,16,88,5,10)进行排序,若前三趟排序结果如下:
第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能________。
A.希尔排序 B. 起泡排序 C. 归并排序 D. 基数排序
填空题
[2021年第5题]. 假设记录R1和R2的关键字相同且R1在R2的前面,如果排序后R1仍在R2的前面则称排序方法是( )的,一般情况下基于( )关键字比较的排序算法是稳定的。
[2019年第9题]. 倘若键值相同的记录,排序前后相对次序总能保持不变,则称排序方法是()的。
[2019年第10题]. 若一组记录的关键字是(46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个关键字为枢轴得到的一趟快速排序结果为____。
名词解释
[2022年第7、10题].
归并排序:
基数排序:
简答题
[2024年第5题]. 当实现插入直接排序过程中,假设R[0..i-1]为有序区,R[i..n-1]为无序区,现要将R[i]插入到有序区中,可以用二分查找来确定R[i]在有序区中的可能插入位置,这样做能否改善直接插入排序算法的时间复杂度?为什么?
[2024年第3题]. 一个有n个整数的数组R[1..n],其中所有元素是有序的,将其看成是一棵完全二叉树,该树构成一个堆吗?若不是,请给一个反例,若是,请说明理由。
[2023年第5题]. 假设待排序元素的关键字序列为{ 78,55,86,45,60,100,70,98,35 },试回答以下问题:
(1)写出第一趟快速排序的执行过程,要求写出原始序列,之后每移动一次元素写出一行。(5分)
(2)快速排序在什么情况下达到最佳时间性能?写出最佳情况下的时间复杂度。(2分)
(3)为避免最坏情况的出现可采取什么优化措施?写出其基本思想。(3分)
[2022年第2题]. 对序列{81,94,11,96,12,35,17,95,28,58,41,75,15}中的关键字按升序排序,采用希尔排序算法,增量序列分别为5,3,1。
(1)请给出第一趟排序的结果;
(2)请给出第二趟排序的结果。
[2022年第6题]. 有10000个未排序的数存放在数组中,请回答以下问题。
(1)请用尽量快的方法从中找出第6000大的数。
(2)若希望尽快找出介于第3000大到第6000大之间的3000个数,又该如何操作。
注:(1)可通过数组中的第K个最大元素进行验证。
[2021年分析计算题第4题]. 设待排序数据的关键字序列为{49,54,60,75,36,93,27},回答以下问题:
(1)写出创建大顶堆的一趟初始建堆的过程,要求写出中间步骤。(解答有问题,要用题目中的数据)
(2)堆排序采用何种存储结构?是否稳定的排序方法?
(3)如果要降序排列全部数据,需要创建大顶堆还是小顶堆?
[2020年第6题]. 已知一组关键值序列{503,87,512,61,908,170,897,275,653,462},试采用堆排序法对该组序列进行降序排序,要求:
(1)用二叉树的形式画出所建立的初始堆,
(2)画出第一次输出堆元素后,经过筛选调整之后的堆。
[2019年综合应用题第6题]. 已知一组关键值序列{503,87,512,61,908,170,897,275,653,462},试采用堆排序法对该组序列进行降序排序,要求:
(1) 对该组序列进行降序排序,建立的初始堆应为大根堆还是小根堆?
(2) 用二叉树的形式画出所建立的初始堆;
(3) 画出第一次输出堆元素后,经过筛选调整之后的堆。
算法设计与编程
[2020年第4题].
记录结构定义如下:
typedef struct {
int key ; //关键字域
Infotype otherinfo; //其它域
}RecordType;
记录依顺序存储结构存放,其类型定义如下:
#define MAXSIZE 100 //最大记录数
typedef struct{
RecordType [MAXSIZE +1]; //0 号单元不存记录
int length;
} SqList;
依据冒泡排序思路,编写实现升序排序的函数,函数原型为:void BubbleSort (Sqlist &L)
请用类 C 语言写出函数代码,适当加上注释,以增加可读性。
[2019年第4题].
已知记录的类型定义如下:
typedef struct{
int key; //关键字域
Infotype otherinfo; //其它域
} RecordType;
记录依顺序存储结构存放,其类型定义如下:
#define MAXSIZE 100 //最大记录数
typedef strcut {
RecordType r[MAXSIZE + 1]; //0号单元不存记录
int length;
} SqList;
编写算法,对依上述方式存储的关键字为整型值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:
①至多使用一个记录的辅助存储空间;
②算法的时间复杂度为 O(n),n 是表中记录的个数;
③ 算法函数原型为:void Process(SqList L)
请:
(1)简述算法思路;
(2)用类C语言写出函数代码,并且加上适当注释,以增加可读性。
综合分析题
[2023年第3题]. 某班的期末考试结束了,班主任要计算全班同学的语文、数学、英语的三科总分,然后按照总分(Score)的降序排列并准备奖励排名前10的同学,要求排序不改变总分相同的同学原来的排列顺序(比如:张三排在赵六的前面且总分相同,排序后仍保持张三排在赵六的前面)。假设如下所示的成绩表采用顺序存储结构,如果班主任委托你完成该项任务,请回答以下问题:
| No | Name | Chinese | Maths | English | Score |
|---|---|---|---|---|---|
| 1 | 张三 | 78.5 | 95.0 | 86.5 | 260.0 |
| 2 | 李四 | 85.0 | 90.5 | 80.5 | 256.0 |
| 3 | 王五 | 96.5 | 93.0 | 89.5 | 279.0 |
| 4 | 赵六 | 82.5 | 87.0 | 90.5 | 260.0 |
| …… | …… | …… | …… | …… | …… |
(1)请写出该成绩表的顺序存储结构的表示。(3分)
(2)要满足排序要求,你认为应采取什么排序方法?请说明理由。(3分)
(3)根据你定义的存储结构,设计算法ScoreSort( )实现如下功能:假设每位同学的单科成绩已经录入,先求出三科成绩的相加和Score,再根据你选择的排序方法按照Score的非递增顺序排序。(12分)
(4)在按总分排序后的成绩表中按给定的总分进行检索,你认为用什么查找方法效率较高,请说明理由。设计算法Search( )实现按总分检索的功能,如果找到则返回该记录全部信息,未找到则给出“未找到相应记录”的提示信息。(12分)
温馨提示:算法首选用类C或其他语言的伪代码描述,也可用自然语言或流程图描述。
[2024年第3题]
(1)给出关键字序列{4,5,1,2,8,6,7,3,10,9}采用直接插入排序时各趟的结果。
(2)设关键字集合D={2,13,6,9,4,11,8,14,10},完成:
A)依次取D中各关键字,构造一棵二叉排序树BT;
B)如何依据此二叉树BT得到D的一个关键字递增序列;
C)画出在二叉树BT中删除13后的树结构。