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]);
    }

}
posted @ 2022-09-24 11:34  天然气之子  阅读(17)  评论(0编辑  收藏  举报