1 of 2

代码详解:阅读程序-1

程序功能

生成一个由按位或运算得到的整数序列,并通过带深度限制的快速排序进行排序,最后输出序列。

详细解释

  1. 序列生成 (generate)
    • 输入参数:a, b
    • 生成长度为 b 的数组 c[]: c[i]=(a ∣ i) mod (b+1),i=0,1,…,b−1
    • 保证每个数在 0 ~ b 的范围内。
    • 例如 a=10, b=6 时,生成的序列大概是:
      i: 0 1 2 3 4 5
      c: 10 11 10 11 14 15
  1. 递归排序 (recursion)
    • 本质上是一个 快速排序,但是有递归深度限制 d
      • 每次选择第一个数作为 pivot
      • 用双指针 i, j 分区。
      • 递归排序左右部分,但深度减 1。
    • d >= b 时,递归足够深,数组最终完全有序。
    • d < b 时,只排一部分,结果可能是“半排序”的。
  1. 主程序 (main)
    • 输入 a, b, d
    • 调用 generate(a,b,c) 生成长度为 b 的序列。
    • 调用 recursion(d,c,b) 对序列进行“受限快排”。
    • 输出最终序列。

输入:

a = 10, b = 6, d = 6
  • 生成的原始序列: 10 11 10 11 14 15
  • 递归排序(深度足够)后: 10 10 11 11 14 15

如果 d 很小,比如 d=1,那排序只做一次分区,结果可能并不完全有序。

代码详细注释

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**************************************************************** 
 * 代码作者: Alex Li
 * 创建时间: 2025-08-30 17:00:04
 * 最后修改: 2025-09-07 03:27:37
 * 文件描述: 2024 CSP-S 阅读程序1
****************************************************************/
#include <algorithm>
#include <iostream>
using namespace std;

// 最大数组长度
const int N = 1000;
int c[N]; // 存储生成的序列

// ==================== 逻辑函数 ====================
// 功能:对两个整数做某种位运算,
// 实际上结果等价于 x | y (按位或)。
int logic(int x, int y) {
    return (x & y) ^ ((x ^ y) | (~x & y));
}

// ==================== 序列生成函数 ====================
// 功能:根据输入 a, b 生成一个长度为 b 的整数序列
// 公式:c[i] = (a | i) % (b+1)
// 其中 i = 0..b-1
void generate(int a, int b, int *c) {
    for (int i = 0; i < b; i++)
        c[i] = logic(a, i) % (b + 1); // 限制结果在 [0, b] 范围内
}

// ==================== 递归排序函数 ====================
// 功能:实现一个受限深度的快速排序(Quicksort)
// 参数:
//   depth —— 最大递归深度(递归次数限制)
//   arr   —— 数组首地址
//   size  —— 数组长度
// 思路:
//   1. 选择 arr[0] 作为基准值(pivot)
//   2. 用双指针 i/j 进行划分,小于 pivot 放左边,大于 pivot 放右边
//   3. 递归处理左右子区间,但深度每次减 1
void recursion(int depth, int *arr, int size) {
    if (depth <= 0 || size <= 1) return; // 停止条件:深度不足或区间长度 ≤1

    int pivot = arr[0];      // 选择第一个元素作为基准
    int i = 0, j = size - 1; // 双指针:i 从左,j 从右

    // 分区过程
    while (i <= j) {
        while (arr[i] < pivot) i++; // 找到左边第一个 ≥ pivot 的数
        while (arr[j] > pivot) j--; // 找到右边第一个 ≤ pivot 的数
        if (i <= j) {
            // 交换 arr[i] 与 arr[j]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++; j--;
        }
    }

    // 递归处理左右子区间
    recursion(depth - 1, arr, j + 1);     // 左半部分 [0..j]
    recursion(depth - 1, arr + i, size - i); // 右半部分 [i..size-1]
}

// ==================== 主函数 ====================
int main() {
    int a, b, d;
    cin >> a >> b >> d; // 输入三个参数

    generate(a, b, c);      // 生成长度为 b 的序列存入 c[]
    recursion(d, c, b);     // 递归排序,深度限制为 d

    // 输出结果序列
    for (int i = 0; i < b; i++)
        cout << c[i] << " ";
    cout << endl;
}
Scroll to Top