题目描述
输入一个长度为n的整数数列,从小到大输出前m小的数。
样例
输入样例:
5 3
4 5 1 3 2
输出样例:
1 2 3
算法1
(暴力sort)
时间复杂度
$O(nlogn)$
C++ 代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int q[N];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i ++) cin >> q[i];
sort(q, q + n);
for(int i = 0; i < m; i ++) cout << q[i] << " ";
}
算法2
(堆)
时间复杂度
$O(nlogn)$
C++ 代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int h[N], siz;
void down(int u)
{
int t = u;
/*
if(h[t] > h[2 * u] && u * 2 <= siz) t = u * 2;
if(h[t] > h[2 * u + 1] && u * 2 + 1 <= siz) t = u * 2 + 1;
*/
if(u * 2 <= siz && h[t] > h[2 * u]) t = u * 2;
if(u * 2 + 1 <= siz && h[t] > h[2 * u + 1]) t = u * 2 + 1;
if(u != t)
{
swap(h[u], h[t]);
down(t);
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &h[i]);
siz = n;
for(int i = n / 2; i; i --) down(i);
while(m --)
{
printf("%d ", h[1]);
h[1] = h[siz];
siz --;
down(1);
}
return 0;
}
dalao注意休息,,,
你那个堆 $O(n^2)$ 是什么鬼。
由于题目给的整数都是正的,可以试试基数排序, $O(n)$ 的。
O(n^2)晚上写的,忘记删了
时间复杂度分析得不一定对,大家看到了可以给我说一下谢谢~