林老师 · 客观题题库 · 第 13 章 排序 · 知识细节练习

第 13 章 排序 · 知识细节练习

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-第13章排序-知识细节练习
题目总数100 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 16 大部分,合计 100 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

排序基本概念

6 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

判断题:排序 = 按关键字(数值大小、字典序等)把一组元素重新排列成升序降序的有序序列。

(1 分)
第 2 题 A2 未作答

单选题:把数组 {3, 1, 4, 1, 5} 排成升序,结果是?

(1 分)
第 3 题 A3 未作答

判断题:稳定性 = 排序后关键字相等的元素之间的相对先后顺序保持不变。

(1 分)
第 4 题 A4 未作答

单选题:以下哪个排序算法基于元素之间的比较?

(1 分)
第 5 题 A5 未作答

单选题:原地排序(in-place)指排序过程的额外空间开销为?

(1 分)
第 6 题 A6 未作答

判断题:评价一个排序算法,通常看三个维度:时间复杂度空间复杂度稳定性

(1 分)

冒泡排序

6 QUESTIONS · 2 POINTS EACH
第 7 题 B1 未作答

判断题:冒泡排序 = 反复比较相邻元素,若逆序就交换,每轮把当前未排部分的最大元素"冒"到末尾。

(1 分)
第 8 题 B2 未作答

单选题:数组 {5, 3, 8, 1, 7} 做冒泡排序的第一轮(从头到尾相邻比较、逆序交换)之后,数组变成?

(1 分)
第 9 题 B3 未作答

单选题:冒泡排序最好情况(已有序 + 优化版)与最坏情况的时间复杂度分别是?

(1 分)
第 10 题 B4 未作答

判断题:冒泡排序是稳定的——相等元素不交换,相对顺序保持不变。

(1 分)
第 11 题 B5 未作答

判断题:冒泡排序加一个"本轮无交换就提前结束"的标志后,对已有序数组只需一轮 n1n - 1 次比较,时间复杂度为 O(n)O(n)

(1 分)
第 12 题 B6 未作答

单选题:n=5n = 5 个元素的数组用冒泡排序(无优化)完全排好序,最多需要几趟?

(1 分)

选择排序

6 QUESTIONS · 2 POINTS EACH
第 13 题 C1 未作答

判断题:选择排序 = 每轮从未排序部分选出最小元素,放到已排序部分的末尾。

(1 分)
第 14 题 C2 未作答

单选题:选择排序对 nn 个元素排序,比较次数和交换次数分别约为?

(1 分)
第 15 题 C3 未作答

判断题:选择排序不稳定——例如 {2, 2, 1}(两个 2 值相同)升序排序时,第一轮把 1 与第一个 2 交换,两个 2 的相对顺序被颠倒。

(1 分)
第 16 题 C4 未作答

单选题:与冒泡排序相比,选择排序的特点是?

(1 分)
第 17 题 C5 未作答

判断题:选择排序第 ii 轮结束后,前 ii 个元素已经就位(就是最终结果的前 ii 个)。

(1 分)
第 18 题 C6 未作答

单选题:选择排序每轮选最小放最前;若改成每轮选最大放最后,排序结果会?

(1 分)

插入排序

6 QUESTIONS · 2 POINTS EACH
第 19 题 D1 未作答

判断题:插入排序像打扑克抓牌:每拿到一张新牌(新元素),把它插入到已排好序部分中的正确位置。

(1 分)
第 20 题 D2 未作答

单选题:插入排序最好情况(已有序)与最坏情况(完全逆序)的时间复杂度分别是?

(1 分)
第 21 题 D3 未作答

判断题:插入排序是稳定的——相等元素时新元素插在旧元素后面,不越过它。

(1 分)
第 22 题 D4 未作答

单选题:插入排序最擅长的场景是?

(1 分)
第 23 题 D5 未作答

判断题:插入排序第 ii 轮结束后,前 ii 个元素是有序的(但不一定是最终结果的前 ii 个)——这正是它与选择排序的区别。

(1 分)
第 24 题 D6 未作答

单选题:插入排序内层把比 key 大的元素逐个后移,循环结束后把 key 放在哪里?

(1 分)

快排与归并

7 QUESTIONS · 2 POINTS EACH
第 25 题 E1 未作答

判断题:快速排序 = 分治:选一个基准元素,把小于基准的放左边、大于基准的放右边(分区),再对左右两部分递归排序。

(1 分)
第 26 题 E2 未作答

单选题:快速排序平均与最坏情况的时间复杂度分别是?

(1 分)
第 27 题 E3 未作答

判断题:快速排序不稳定——分区时的隔空交换会打乱相等元素的相对顺序。

(1 分)
第 28 题 E4 未作答

单选题:快速排序的额外空间主要来自?

(1 分)
第 29 题 E5 未作答

判断题:归并排序 = 分治:先对半分递归排序,再把两个有序子数组合并成一个有序数组。

(1 分)
第 30 题 E6 未作答

单选题:归并排序的时间复杂度(无论输入如何)是?

(1 分)
第 31 题 E7 未作答

判断题:归并排序需要 O(n)O(n) 的辅助数组,并且是稳定排序。

(1 分)

堆排序与计数排序

7 QUESTIONS · 2 POINTS EACH
第 32 题 F1 未作答

判断题:堆排序 = 先建堆,再反复把堆顶(最大或最小)与末尾元素交换并向下调整,n1n - 1 次后数组有序。

(1 分)
第 33 题 F2 未作答

单选题:堆排序的时间复杂度与额外空间复杂度分别是?

(1 分)
第 34 题 F3 未作答

判断题:堆排序不稳定——建堆与反复交换堆顶的过程会打乱相等元素的相对顺序。

(1 分)
第 35 题 F4 未作答

判断题:计数排序 = 统计每个可能值出现的次数,再按值从小到大依次输出(每个值输出其出现次数遍)。

(1 分)
第 36 题 F5 未作答

单选题:计数排序对 nn 个元素、值域 0k0 \sim k 排序,时间复杂度是?

(1 分)
第 37 题 F6 未作答

判断题:计数排序适合整数且值域较小的场景,并且可以实现为稳定排序(配合前缀和)。

(1 分)
第 38 题 F7 未作答

判断题:C++ 的 sort(a, a + n) 默认升序排列;第三个参数可传自定义比较器(如 greater<int>()、lambda 表达式)实现降序或按关键字排序——这是初赛完善程序的常考点。

(1 分)

复杂度与稳定性总表

7 QUESTIONS · 2 POINTS EACH
第 39 题 G1 未作答

单选题:以下哪组排序的最坏时间复杂度都是 O(n2)O(n^2)

(1 分)
第 40 题 G2 未作答

单选题:平均时间复杂度为 O(nlog2n)O(n \log_2 n) 的排序是?

(1 分)
第 41 题 G3 未作答

单选题:最坏情况下时间复杂度也保持 O(nlog2n)O(n \log_2 n) 的排序是?

(1 分)
第 42 题 G4 未作答

单选题:以下哪组排序全部是稳定的?

(1 分)
第 43 题 G5 未作答

判断题:选择排序、快速排序、堆排序都是不稳定排序。

(1 分)
第 44 题 G6 未作答

判断题:基于元素比较的排序,最坏时间复杂度至少O(nlog2n)O(n \log_2 n);计数/基数等非比较排序可以做到 O(n)O(n) 级别,因此能"突破"这个下界。

(1 分)
第 45 题 G7 未作答

单选题:n=106n = 10^6 个随机整数要排序,最稳妥的选择是?

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

单选题:判断稳定性的直观依据:排序中是否会发生隔空交换(两个不相邻元素直接互换)或相等元素被越过。以下哪个是稳定排序?

(1 分)
第 47 题 H2 未作答

单选题:快速排序退化为 O(n2)O(n^2) 的典型情况是?

(1 分)
第 48 题 H3 未作答

单选题:待排序数据是取值范围高达 10910^9 的整数(如坐标、编号),还能用计数排序吗?

(1 分)
第 49 题 H4 未作答

单选题:归并排序对 88 个元素排序,分治分裂的层数是?

(1 分)
第 50 题 H5 未作答

判断题:以下结论全部正确——"冒泡、插入稳定;选择、快排、堆不稳定;归并最坏 O(nlog2n)O(n \log_2 n) 且稳定;快排平均 O(nlog2n)O(n \log_2 n) 但最坏 O(n2)O(n^2)"。

(1 分)

冒泡排序代码

6 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++)            // n-1 趟
07        for (int j = 0; j < n - 1 - i; j++)    // 每趟比较相邻元素
08            if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
09    for (int i = 0; i < n; i++) cout << a[i] << " ";
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 52 题 I2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5, cnt = 0;
06    for (int i = 0; i < n - 1; i++)
07        for (int j = 0; j < n - 1 - i; j++)
08            if (a[j] > a[j + 1]) { swap(a[j], a[j + 1]); cnt++; }  // 每次交换计数
09    cout << cnt;
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 53 题 I3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {9, 2, 7, 4, 1};
05    int n = 5;
06    for (int j = 0; j < n - 1; j++)    // 只做第一趟
07        if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
08    for (int i = 0; i < n; i++) cout << a[i] << " ";
09    return 0;
10}

单选题:程序输出是?

(1 分)
第 54 题 I4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {1, 2, 3, 5, 4};   // 基本有序
05    int n = 5, pass = 0;
06    bool swapped = true;          // 本轮是否有交换
07    for (int i = 0; i < n - 1 && swapped; i++) {
08        swapped = false;
09        for (int j = 0; j < n - 1 - i; j++)
10            if (a[j] > a[j + 1]) { swap(a[j], a[j + 1]); swapped = true; }
11        pass++;                   // 每跑一趟计数
12    }
13    cout << pass;
14    return 0;
15}

单选题:程序输出是?

(1 分)
第 55 题 I5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {3, 1, 4, 1, 5};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++)
07        for (int j = 0; j < n - 1 - i; j++)
08            if (a[j] < a[j + 1]) swap(a[j], a[j + 1]);   // 注意:比较方向是 <
09    for (int i = 0; i < n; i++) cout << a[i] << " ";
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 56 题 I6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {4, 2, 5, 1, 3};
05    int n = 5;
06    for (int i = 0; i < 2; i++)            // 只做前 2 趟
07        for (int j = 0; j < n - 1 - i; j++)
08            if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
09    for (int i = 0; i < n; i++) cout << a[i] << " ";
10    return 0;
11}

单选题:程序输出是?

(1 分)

选择排序代码

6 QUESTIONS · 2 POINTS EACH
第 57 题 J1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;                        // 假定 a[i] 是当前最小
08        for (int j = i + 1; j < n; j++)
09            if (a[j] < a[p]) p = j;       // 找 [i, n-1] 中最小的下标
10        swap(a[i], a[p]);                 // 最小元素放到前面
11    }
12    for (int i = 0; i < n; i++) cout << a[i] << " ";
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 58 题 J2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5, cnt = 0;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;
08        for (int j = i + 1; j < n; j++)
09            if (a[j] < a[p]) p = j;
10        if (p != i) { swap(a[i], a[p]); cnt++; }   // 位置变了才交换
11    }
12    cout << cnt;
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 59 题 J3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {9, 2, 7, 4, 1};
05    int n = 5;
06    int i = 0, p = 0;                      // 只做第一轮
07    for (int j = 1; j < n; j++)
08        if (a[j] < a[p]) p = j;
09    swap(a[i], a[p]);
10    for (int i = 0; i < n; i++) cout << a[i] << " ";
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 60 题 J4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5;
06    for (int i = n - 1; i > 0; i--) {
07        int p = 0;                        // 找 [0, i] 中最大的下标
08        for (int j = 1; j <= i; j++)
09            if (a[j] > a[p]) p = j;
10        swap(a[i], a[p]);                 // 最大元素放到末尾
11    }
12    for (int i = 0; i < n; i++) cout << a[i] << " ";
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 61 题 J5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[4] = {3, 1, 4, 2};
05    int n = 4, cnt = 0;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;
08        for (int j = i + 1; j < n; j++) {
09            if (a[j] < a[p]) p = j;
10            cnt++;                        // 每比较一次计数
11        }
12    }
13    cout << cnt;
14    return 0;
15}

单选题:程序输出是?

(1 分)
第 62 题 J6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 1, 4, 2, 3};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;
08        for (int j = i + 1; j < n; j++)
09            if (a[j] < a[p]) p = j;
10        swap(a[i], a[p]);
11        cout << a[i] << " ";              // 每轮输出刚就位的元素
12    }
13    return 0;
14}

单选题:程序输出是?

(1 分)
拾壹

插入排序代码

6 QUESTIONS · 2 POINTS EACH
第 63 题 K1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5;
06    for (int i = 1; i < n; i++) {
07        int key = a[i], j = i - 1;        // 待插入元素 key
08        while (j >= 0 && a[j] > key) {    // 比 key 大的逐个后移
09            a[j + 1] = a[j];
10            j--;
11        }
12        a[j + 1] = key;                   // key 落位
13    }
14    for (int i = 0; i < n; i++) cout << a[i] << " ";
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 64 题 K2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {9, 2, 7, 4, 1};
05    int n = 5;
06    for (int i = 1; i <= 2; i++) {        // 只插入前 2 个元素
07        int key = a[i], j = i - 1;
08        while (j >= 0 && a[j] > key) { a[j + 1] = a[j]; j--; }
09        a[j + 1] = key;
10    }
11    for (int i = 0; i < n; i++) cout << a[i] << " ";
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 65 题 K3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[4] = {4, 3, 2, 1};   // 完全逆序
05    int n = 4, cnt = 0;
06    for (int i = 1; i < n; i++) {
07        int key = a[i], j = i - 1;
08        while (j >= 0 && a[j] > key) {
09            a[j + 1] = a[j];   // 每移动一次计数
10            j--;
11            cnt++;
12        }
13        a[j + 1] = key;
14    }
15    cout << cnt;
16    return 0;
17}

单选题:程序输出是?

(1 分)
第 66 题 K4 未作答

单选题:插入排序内层循环 while (j >= 0 && a[j] > key) 中,条件 a[j] > key 的作用是?

(1 分)
第 67 题 K5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {1, 2, 3, 4, 5};   // 已经有序
05    int n = 5, cnt = 0;
06    for (int i = 1; i < n; i++) {
07        int key = a[i], j = i - 1;
08        while (j >= 0 && a[j] > key) {
09            a[j + 1] = a[j];
10            j--;
11            cnt++;
12        }
13        a[j + 1] = key;
14    }
15    cout << cnt;
16    return 0;
17}

单选题:程序输出是?

(1 分)
第 68 题 K6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {3, 1, 4, 1, 5, 9};
05    int n = 6;
06    for (int i = 1; i <= 2; i++) {        // 前 3 个元素(a[0..2])排好序
07        int key = a[i], j = i - 1;
08        while (j >= 0 && a[j] > key) { a[j + 1] = a[j]; j--; }
09        a[j + 1] = key;
10    }
11    for (int i = 0; i < n; i++) cout << a[i] << " ";
12    return 0;
13}

单选题:程序输出是?

(1 分)
拾贰

快速排序代码

7 QUESTIONS · 2 POINTS EACH
第 69 题 L1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[7] = {6, 1, 2, 7, 9, 3, 5};
05    int n = 7, pivot = a[0];              // 以 a[0] = 6 为基准
06    int i = 0;                            // i 指向最后一个小于基准的位置
07    for (int j = 1; j < n; j++)
08        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
09    swap(a[0], a[i]);                     // 基准落位
10    for (int k = 0; k < n; k++) cout << a[k] << " ";
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 70 题 L2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6];
04void qs(int l, int r) {                   // 对 [l, r] 快速排序
05    if (l >= r) return;
06    int pivot = a[l], i = l;
07    for (int j = l + 1; j <= r; j++)
08        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
09    swap(a[l], a[i]);
10    qs(l, i - 1);
11    qs(i + 1, r);
12}
13int main() {
14    int b[6] = {4, 2, 6, 1, 3, 5};
15    for (int i = 0; i < 6; i++) a[i] = b[i];
16    qs(0, 5);
17    for (int i = 0; i < 6; i++) cout << a[i] << " ";
18    return 0;
19}

单选题:程序输出是?

(1 分)
第 71 题 L3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {3, 1, 4, 1, 5, 2};
05    int n = 6, pivot = a[0], i = 0;
06    for (int j = 1; j < n; j++)
07        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
08    swap(a[0], a[i]);
09    cout << i;                            // 基准最终落在的下标
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 72 题 L4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5], mx = 0, dep = 0;
04void qs(int l, int r) {
05    if (l >= r) return;
06    dep++;
07    mx = max(mx, dep);                    // 记录最大递归深度
08    int pivot = a[l], i = l;
09    for (int j = l + 1; j <= r; j++)
10        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
11    swap(a[l], a[i]);
12    qs(l, i - 1);
13    qs(i + 1, r);
14    dep--;
15}
16int main() {
17    int b[5] = {1, 2, 3, 4, 5};           // 已有序,固定首元素作基准
18    for (int i = 0; i < 5; i++) a[i] = b[i];
19    qs(0, 4);
20    cout << mx;
21    return 0;
22}

单选题:程序输出是?

(1 分)
第 73 题 L5 未作答

判断题:快排每次固定选首元素作基准、且数组已有序时,每次分区只排除基准自身,退化为 O(n2)O(n^2)

(1 分)
第 74 题 L6 未作答

单选题:为避免快排退化成 O(n2)O(n^2),常用的改进是?

(1 分)
第 75 题 L7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[5] = {2, 5, 1, 4, 3};
04void qs(int l, int r) {
05    if (l >= r) return;
06    int pivot = a[l], i = l;
07    for (int j = l + 1; j <= r; j++)
08        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
09    swap(a[l], a[i]);
10    cout << i << " ";                     // 输出本轮基准落位下标
11    qs(l, i - 1);
12    qs(i + 1, r);
13}
14int main() { qs(0, 4); return 0; }

单选题:程序输出是?

(1 分)
拾叁

归并排序代码

7 QUESTIONS · 2 POINTS EACH
第 76 题 M1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[8] = {2, 4, 7, 9, 1, 3, 5, 8};  // 左半 [0,3] 与右半 [4,7] 各自有序
05    int tmp[8];
06    int l = 0, mid = 3, r = 7;
07    int i = l, j = mid + 1, k = l;
08    while (i <= mid && j <= r) {          // 合并两个有序段
09        if (a[i] <= a[j]) tmp[k++] = a[i++];
10        else tmp[k++] = a[j++];
11    }
12    while (i <= mid) tmp[k++] = a[i++];
13    while (j <= r) tmp[k++] = a[j++];
14    for (int t = l; t <= r; t++) { a[t] = tmp[t]; cout << a[t] << " "; }
15    return 0;
16}

单选题:程序输出是?

(1 分)
第 77 题 M2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6], tmp[6];
04void ms(int l, int r) {                   // 对 [l, r] 归并排序
05    if (l >= r) return;
06    int mid = (l + r) / 2;
07    ms(l, mid);
08    ms(mid + 1, r);
09    int i = l, j = mid + 1, k = l;
10    while (i <= mid && j <= r) {
11        if (a[i] <= a[j]) tmp[k++] = a[i++];
12        else tmp[k++] = a[j++];
13    }
14    while (i <= mid) tmp[k++] = a[i++];
15    while (j <= r) tmp[k++] = a[j++];
16    for (int t = l; t <= r; t++) a[t] = tmp[t];
17}
18int main() {
19    int b[6] = {6, 5, 3, 1, 8, 7};
20    for (int i = 0; i < 6; i++) a[i] = b[i];
21    ms(0, 5);
22    for (int i = 0; i < 6; i++) cout << a[i] << " ";
23    return 0;
24}

单选题:程序输出是?

(1 分)
第 78 题 M3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[8], tmp[8];
04void ms(int l, int r) {
05    if (l >= r) return;
06    int mid = (l + r) / 2;
07    ms(l, mid);
08    ms(mid + 1, r);
09    int i = l, j = mid + 1, k = l;
10    while (i <= mid && j <= r) {
11        if (a[i] <= a[j]) tmp[k++] = a[i++];
12        else tmp[k++] = a[j++];
13    }
14    while (i <= mid) tmp[k++] = a[i++];
15    while (j <= r) tmp[k++] = a[j++];
16    for (int t = l; t <= r; t++) a[t] = tmp[t];
17    if (r - l + 1 == 4) {                 // 输出所有长度为 4 的合并结果
18        for (int t = l; t <= r; t++) cout << a[t] << " ";
19    }
20}
21int main() {
22    int b[8] = {3, 6, 2, 5, 8, 1, 7, 4};
23    for (int i = 0; i < 8; i++) a[i] = b[i];
24    ms(0, 7);
25    return 0;
26}

单选题:程序输出是?

(1 分)
第 79 题 M4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[4] = {3, 1, 4, 2};
04int tmp[4];
05long long cnt = 0;
06void ms(int l, int r) {
07    if (l >= r) return;
08    int mid = (l + r) / 2;
09    ms(l, mid);
10    ms(mid + 1, r);
11    int i = l, j = mid + 1, k = l;
12    while (i <= mid && j <= r) {
13        if (a[i] <= a[j]) tmp[k++] = a[i++];
14        else {
15            tmp[k++] = a[j++];
16            cnt += mid - i + 1;           // 核心:a[j] 小于左段剩余全部元素
17        }
18    }
19    while (i <= mid) tmp[k++] = a[i++];
20    while (j <= r) tmp[k++] = a[j++];
21    for (int t = l; t <= r; t++) a[t] = tmp[t];
22}
23int main() { ms(0, 3); cout << cnt; return 0; }

单选题:程序输出是?

(1 分)
第 80 题 M5 未作答

判断题:归并排序合并两个有序段时,比较次数最多约为两段长度之和(每比较一次至少确定一个元素的位置)。

(1 分)
第 81 题 M6 未作答

判断题:归并排序合并时必须借助 O(n)O(n) 辅助数组(如 tmp);在原数组上"原地"合并会覆盖尚未处理的数据。

(1 分)
第 82 题 M7 未作答

单选题:归并排序合并时,把条件 a[i] <= a[j] 改成 a[i] < a[j] 会?

(1 分)
拾肆

其他排序代码

7 QUESTIONS · 2 POINTS EACH
第 83 题 N1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[7] = {4, 2, 2, 8, 3, 3, 1};
05    int cnt[9] = {0};                     // 值域 0~8,cnt[v] = v 出现次数
06    for (int i = 0; i < 7; i++) cnt[a[i]]++;
07    for (int v = 0; v <= 8; v++)
08        for (int t = 0; t < cnt[v]; t++)
09            cout << v << " ";             // 按值从小到大输出
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 84 题 N2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {3, 1, 3, 4, 2, 3};
05    int cnt[6] = {0};                     // 值域 0~5
06    for (int i = 0; i < 6; i++) cnt[a[i]]++;
07    for (int v = 0; v <= 5; v++) cout << cnt[v] << " ";   // 输出各值的出现次数
08    return 0;
09}

单选题:程序输出是?

(1 分)
第 85 题 N3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {2, 1, 2, 3, 1};          // 值域 1~3
05    int cnt[5] = {0}, pos[5] = {0};
06    for (int i = 0; i < 5; i++) cnt[a[i]]++;
07    for (int v = 1; v <= 3; v++) pos[v] = pos[v - 1] + cnt[v - 1];
08    // 说明:pos[v] = 稳定版计数排序中,值 v 在输出数组里的起始位置
09    for (int v = 1; v <= 3; v++) cout << pos[v] << " ";
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 86 题 N4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {2, 1, 2, 3, 1};       // 值域 1~3
05    int n = 5, cnt[5] = {0}, pos[5] = {0}, out[5];
06    for (int i = 0; i < n; i++) cnt[a[i]]++;
07    for (int v = 1; v <= 3; v++) pos[v] = pos[v - 1] + cnt[v - 1];  // 前缀和:每个值的起始位置
08    for (int i = 0; i < n; i++) out[pos[a[i]]++] = a[i];            // 按起始位置摆放
09    for (int i = 0; i < n; i++) cout << out[i] << " ";
10    return 0;
11}

单选题:程序输出是?

(1 分)
第 87 题 N5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03struct P { int a, b; };               // 双关键字记录
04int main() {
05    P p[4] = {{2,1},{1,2},{2,2},{1,1}};
06    sort(p, p + 4, [](P x, P y){
07        if (x.a != y.a) return x.a < y.a;   // 先按第一关键字升序
08        return x.b < y.b;                   // 再按第二关键字升序
09    });
10    for (int i = 0; i < 4; i++) cout << p[i].a << "," << p[i].b << " ";
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 88 题 N6 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {4, 1, 3, 2, 6, 5};
05    priority_queue<int, vector<int>, greater<int>> q;   // 小根堆
06    for (int i = 0; i < 6; i++) q.push(a[i]);
07    while (!q.empty()) {
08        cout << q.top() << " ";           // 每次取当前最小
09        q.pop();
10    }
11    return 0;
12}

单选题:程序输出是?

(1 分)
第 89 题 N7 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[7] = {0, 3, 8, 1, 9, 2, 7};        // a[0] 不用,下标 1~6 建大根堆
04int n = 6;
05void down(int x) {                        // 下沉调整:大元素上浮
06    int t = x;
07    if (2 * x <= n && a[2 * x] > a[t]) t = 2 * x;
08    if (2 * x + 1 <= n && a[2 * x + 1] > a[t]) t = 2 * x + 1;
09    if (t != x) { swap(a[t], a[x]); down(t); }
10}
11int main() {
12    for (int i = n / 2; i >= 1; i--) down(i);   // 自底向上建堆
13    for (int i = 1; i <= n; i++) cout << a[i] << " ";
14    return 0;
15}

单选题:程序输出是?

(1 分)
拾伍

完善程序

5 QUESTIONS · 2 POINTS EACH
第 90 题 O1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {5, 1, 4, 2, 8, 3};
05    int n = 6;
06    for (int i = 0; i < n - 1; i++)
07        for (int j = 0; j < ______; j++)
08            if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
09    for (int i = 0; i < n; i++) cout << a[i] << " ";
10    return 0;
11}

单选题:横线处应填入?

(1 分)
第 91 题 O2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {5, 1, 4, 2, 8, 3};
05    int n = 6;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;
08        for (int j = i + 1; j < n; j++)
09            if (______) p = j;
10        swap(a[i], a[p]);
11    }
12    for (int i = 0; i < n; i++) cout << a[i] << " ";
13    return 0;
14}

单选题:横线处应填入?

(1 分)
第 92 题 O3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[6] = {5, 1, 4, 2, 8, 3};
05    int n = 6;
06    for (int i = 1; i < n; i++) {
07        int key = a[i], j = i - 1;
08        while (______) { a[j + 1] = a[j]; j--; }
09        a[j + 1] = key;
10    }
11    for (int i = 0; i < n; i++) cout << a[i] << " ";
12    return 0;
13}

单选题:横线处应填入?

(1 分)
第 93 题 O4 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int a[6] = {5, 1, 4, 2, 8, 3};
04void qs(int l, int r) {
05    if (l >= r) return;
06    int pivot = a[l], i = l;
07    for (int j = l + 1; j <= r; j++)
08        if (a[j] < pivot) { i++; swap(a[i], a[j]); }
09    swap(a[l], ______);
10    qs(l, i - 1);
11    qs(i + 1, r);
12}
13int main() {
14    qs(0, 5);
15    for (int i = 0; i < 6; i++) cout << a[i] << " ";
16    return 0;
17}

单选题:横线处应填入?

(1 分)
第 94 题 O5 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[4] = {1, 3, 2, 4};              // 左半 [0,1] 与右半 [2,3] 各自有序
05    int tmp[4];
06    int l = 0, mid = 1, r = 3;
07    int i = l, j = mid + 1, k = l;
08    while (i <= mid && j <= r) {
09        if (a[i] <= a[j]) tmp[k++] = a[i++];
10        else tmp[k++] = a[j++];
11    }
12    while (______) tmp[k++] = a[i++];     // 左半有剩余
13    while (j <= r) tmp[k++] = a[j++];
14    for (int t = l; t <= r; t++) { a[t] = tmp[t]; cout << a[t] << " "; }
15    return 0;
16}

单选题:横线处应填入?

(1 分)
拾陆

代码易错与综合

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 1, 4, 2, 3};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++)
07        for (int j = 0; j < n - i; j++)     // 错误:应为 n - 1 - i
08            if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
09    for (int i = 0; i < n; i++) cout << a[i] << " ";
10    return 0;
11}

单选题:这段程序会?

(1 分)
第 96 题 P2 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[5] = {5, 3, 8, 1, 7};
05    int n = 5;
06    for (int i = 0; i < n - 1; i++) {
07        int p = i;
08        for (int j = i + 1; j < n; j++)
09            if (a[j] > a[p]) p = j;         // 错误:找最大放到前面
10        swap(a[i], a[p]);
11    }
12    for (int i = 0; i < n; i++) cout << a[i] << " ";
13    return 0;
14}

单选题:程序输出是?

(1 分)
第 97 题 P3 未作答

01#include <bits/stdc++.h>
02using namespace std;
03int main() {
04    int a[4] = {3, 1, 4, 2};
05    int n = 4;
06    for (int i = 1; i < n; i++) {
07        int key = a[i], j = i - 1;
08        while (j >= 0 && a[j] < key) { a[j + 1] = a[j]; j--; }  // 错误:方向写反
09        a[j + 1] = key;
10    }
11    for (int i = 0; i < n; i++) cout << a[i] << " ";
12    return 0;
13}

单选题:程序输出是?

(1 分)
第 98 题 P4 未作答

单选题:快排递归函数开头缺少 if (l >= r) return; 这个终止条件,会发生什么?

(1 分)
第 99 题 P5 未作答

单选题:归并排序合并循环里,把写入辅助数组的 tmp[k++] 误写成 tmp[i++],后果是?

(1 分)
第 100 题 P6 未作答

单选题:计数排序中统计数组 cnt[5](下标 040 \sim 4),而数据里出现了值 55,执行 cnt[a[i]]++ 会?

(1 分)