ac 838堆排序
这里是维护一个m大小的堆,每一个比堆顶小的数字都放进来进行一次heapify。
题目的意思我以为是只需要输出前m小的数字不需要排序,但是看答案意思需要,所以最后麻烦了一下
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int minNum[N], s = 0;
int num[N];
void swap(int a, int b) {
int temp;
temp = minNum[a];
minNum[a] = minNum[b];
minNum[b] = temp;
}
void down(int n, int i) {
if (i >= n) return;
int c1 = i * 2 + 1;
int c2 = i * 2 + 2;
int m = i;
if (c1 < n && minNum[c1] > minNum[m]) {
m = c1;
}
if (c2 < n && minNum[c2] > minNum[m]) {
m = c2;
}
if (m != i) {
swap(m, i);
down(n, m);
}
}
void build (int n) {
for (int i = (n - 2) / 2; i >= 0; i--) {//减二一个是因为数组的下标问题还有有一是因为树的父亲是 (n - 1) / 2
down(n, i);
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
num[i] = temp;
if (s > m && temp < minNum[0]) {
minNum[0] = temp;
down(m, 0);
}
else if (s == m) {
build(s);
if (temp < minNum[0]) {
minNum[0] = temp;
down(s, 0);
}
s++;
}
else{
minNum[s ++] = temp;
}
}
sort(minNum , minNum + m);
for (int i = 0; i < m; i++) {
printf("%d ", minNum[i]);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人