生成一个由按位或运算得到的整数序列,并通过带深度限制的快速排序进行排序,最后输出序列。
generate
)
a, b
b
的数组 c[]
: c[i]=(a ∣ i) mod (b+1),i=0,1,…,b−10 ~ b
的范围内。a=10, b=6
时,生成的序列大概是: i: 0 1 2 3 4 5
c: 10 11 10 11 14 15
recursion
)
d
:
pivot
。i, j
分区。d >= b
时,递归足够深,数组最终完全有序。d < b
时,只排一部分,结果可能是“半排序”的。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; } |