// 引入头文件 #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;

请帮这段代码每行备注#include iostream#include vectorusing namespace std;int partitionvectorint& nums int left int right int pivot = numsright; int i = left; for int j = left; j right; j++ if

原文地址: https://www.cveoy.top/t/topic/fnVP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录