// 引入头文件
#include
#include
using namespace std;
// 快速排序的划分函数
int partition(vector& nums, int left, int right) {
int pivot = nums[right]; // 选取最右边的数作为基准点
int i = left;
for (int j = left; j < right; j++) { // 遍历数组
if (nums[j] <= pivot) { // 如果当前数比基准点小,就将其交换到左侧
swap(nums[i], nums[j]);
i++;
}
}
swap(nums[i], nums[right]); // 将基准点交换到左右两侧数的中间
return i; // 返回基准点的下标
}
// 快速选择函数
int quickSelect(vector& nums, int left, int right, int k) {
if (left == right) { // 如果只有一个数,直接返回
return nums[left];
}
int pivotIndex = partition(nums, left, right); // 划分数组
int count = pivotIndex - left + 1; // 计算左侧数的个数
if (count == k) { // 基准点是第k个数,直接返回
return nums[pivotIndex];
} else if (count > k) { // 基准点左侧的数的个数大于k,继续在左侧递归查找
return quickSelect(nums, left, pivotIndex - 1, k);
} else { // 基准点左侧的数的个数小于k,继续在右侧递归查找
return quickSelect(nums, pivotIndex + 1, right, k - count);
}
}
// 主函数
int main() {
int n, k1, k2;
cin >> n >> k1 >> k2; // 输入n和k1、k2
vector nums(n);
for (int i = 0; i < n; i++) { // 输入n个数
cin >> nums[i];
}
int k1th = quickSelect(nums, 0, n - 1, k1); // 找到第k1小的数
int k2th = quickSelect(nums, 0, n - 1, k2); // 找到第k2小的数
if (k1th > k2th) { // 交换两个数,使得k1th <= k2th
swap(k1th, k2th);
}
for (int i = 0; i < n; i++) { // 遍历数组
if (nums[i] >= k1th && nums[i] <= k2th) { // 如果当前数在k1th和k2th之间,输出
cout << nums[i] << " ";
}
}
cout << endl; // 输出换行符
return 0;