题解
2025-05-07 17:08:03
发布于:浙江
233阅读
0回复
0点赞
思路:用排序排完后直接输出。由于时间有限,本题只给出时间复杂度约为的三种代码。
代码:
方法一(快排):
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int n;
void partition(int a[],int l,int r)
{
int x=a[l],i=l,j=r;
if(l>=r) return;
while(i<j)
{
while(i<j and a[j]>=x) j--;
a[i]=a[j];
while(i<j and a[i]<=x) i++;
a[j]=a[i];
}
a[i]=x;
/*cout << a[0];
for(int i=1;i<n;i++)
cout<<' '<<a[i];
cout<<endl;*/
partition(a,l,i-1);
partition(a,i+1,r);
}
int main()
{
cin>>n;
int k;
cin >> k;
for(int i=0;i<n;i++) cin>>a[i];
partition(a,0,n-1);
cout << a[n-k];
return 0;
}
时间复杂度:
方法二(sort排)
#include <bits/stdc++.h>
using namespace std;
int main(){
int a;
cin >> a;
int k;
cin >> k;
int sz[1000005]={};
for(int i=1;i<=a;i++){
cin >> sz[i];
}sort(sz+1,sz+a+1);
cout << sz[a-k+1];
return 0;
}
时间复杂度:
方法三(归并):
#include<iostream>
using namespace std;
int n , a[1010] , temp[1010];
void MergeSort(int l , int r)
{
//2.1、递归的结束条件:只有一个数,就不用再递归下去,直接返回
if(l==r){
return ;
}
//2.2、找到中间位置,递归处理左半部分,递归处理右半部分
int mid = (l + r) / 2;
MergeSort(l,mid);
MergeSort(mid+1,r);
//3、合并,两个序列分别为[l,mid] 和 [mid+1,r],从最左边开始,依次比较,小的数放入结果数组temp,下标右移
int i = l, j = mid + 1, k = l;
while(i <=mid && j <= r)
{
if(a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
//3.1、判断两个序列是否有剩余,有剩余的,全部放入结果数组 temp
while(i <= mid)
temp[k++] = a[i++];
while(j <= r)
temp[k++] = a[j++];
//4、把结果数组 temp 重新赋给 a 数组
for(int i=l;i<=r;i++)
a[i]=temp[i];
}
int main()
{
//1、定义变量 n 和数组
cin >> n;
int k;
cin >> k;
for(int i = 1; i <= n; i++)
cin >> a[i];
//2、划分,左端点为 1,右端点为 n,递归处理
MergeSort(1 , n);
cout << a[n-k+1];
return 0;
}
时间复杂度:
全部评论 3
方法二为什么会这样:cout << sz[a-k+1];
3天前 来自 上海
1方法三(归并)可以优化:
#include <bits/stdc++.h>
using namespace std;const int N = 1e6 + 10;
int a[N];
int n, k;// 返回基准值最终所在的下标
int partition(int l, int r) {
// 随机化基准值,防止最坏情况 O(N^2)
int rand_idx = l + rand() % (r - l + 1);
swap(a[l], a[rand_idx]);int x = a[l], i = l, j = r; while (i < j) { while (i < j && a[j] >= x) j--; // 注意:找第K大,大的放左边还是右边取决于你的逻辑 // 这里我们维持原代码逻辑:小的在左,大的在右? // 原代码逻辑:a[j]>=x 跳过,说明想把小的换到左边。 // 让我们统一标准:升序排列。 while (i < j && a[i] <= x) i++; if (i < j) swap(a[i], a[j]); } a[l] = a[i]; // 此时 i==j a[i] = x; return i;}
// 快速选择:在 a[l..r] 中寻找升序排列后下标为 target 的元素
void quick_select(int l, int r, int target) {
if (l >= r) return;int pos = partition(l, r); if (pos == target) { return; // 找到了,a[target] 就是答案 } else if (target < pos) { quick_select(l, pos - 1, target); // 只在左边找 } else { quick_select(pos + 1, r, target); // 只在右边找 }}
int main() {
srand(time(0)); // 初始化随机种子
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];// 第 k 大数,在升序数组中的下标是 n - k // 例如 n=5, k=1 (最大), 下标 4. n-k = 4. int target_index = n - k; quick_select(0, n - 1, target_index); cout << a[target_index] << endl; return 0;}
时间复杂度:O(n)2026-07-30 来自 江西
0千年老唐贴了,而且你这 AI 有啥意义
2026-07-30 来自 浙江
0
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
2026-01-23 来自 浙江
0



















有帮助,赞一个