文章目录
原题连接:786-简单-第k个数
前言
算法是考研和实习找工作进大厂的必备工具,为了23考研以及日后进大厂,开始学习算法!
作者简介
大家好,我是977,一个正在慢慢进步的程序猿小白,很高兴能在这里遇见大家,每天一点点成长,一起早日成为大佬!!!
算法基础课共106题
这是我的第2/106题
题目描述
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。
输入格式
第一行包含整数 n 和 k。
第二行包含 n 个整数(所有整数均在1~范围内),表示整个数列。
输出格式
输出一个整数,表示数列的第 k 小数。
数据范围
1≤n≤100000
输入样例
5 3
2 4 1 5 3
输入样例
3
思路解析:
算法:快速排序 ( Quick Sort )
时间复杂度:O(nlog(n))
解题思路:
1.使用快速排序,把数组从小到大进行排序
2.然后直接输出对应下标的数(记得减一)
代码(c++)
#include<iostream>
using namespace std;
const int N = 100010;
int n,k;
int q[N];
//快速排序函数
void quick_sort(int l,int r){
if(l >= r)return;
int x = q[l + r >> 1],i = l - 1,j = r + 1;
while(i < j){
do i++;while(q[i] < x);
do j--;while(q[j] > x);
if(i < j) swap(q[i],q[j]);
}
quick_sort(l,j);
quick_sort(j + 1,r);
}
int main(){
//输入数列长度n,以及要输出的第k个数
scanf("%d %d", &n,&k);
//遍历输入数列中的数
for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
//使用快速排序函数从大到小进行排序
quick_sort(0,n - 1);
//输出第k个数(记得k-1),因为数列的下标是从0开始的
printf("%d",q[k - 1]);
return 0;
}
结语
学习贵在坚持,Acwing算法基础课,每日一题
期待各位的关注和监督