题解
2025-05-07 17:08:03
发布于:浙江
14阅读
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;
}
时间复杂度:
这里空空如也
有帮助,赞一个