AcWing 838. 堆排序

本文深入解析堆排序算法,包括如何构建最小堆、删除最小值、调整堆结构等关键步骤,并通过具体实例展示如何使用堆排序从整数数列中找出前m小的数。文章提供完整的Java代码实现,帮助读者理解并掌握堆排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识点:堆排序

输入一个长度为n的整数数列,从小到大输出前m小的数。

输入格式

第一行包含整数n和m。

第二行包含n个整数,表示整数数列。

输出格式

共一行,包含m个整数,表示整数数列中前m小的数。

数据范围

1≤m≤n≤1051≤m≤n≤105,
1≤数列中元素≤1091≤数列中元素≤109

输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3
//建堆
//删除最小值
//删除指定下标k
//插入
//修改k的值

import java.io.*;
import java.lang.Integer;

class Main{
    static int N = 100010;
    static int[] t = new int[N];
    static int size = 0;
    static void down(int n){
        int x = n;
        if(n * 2 <= size && t[x] > t[n * 2])x = n * 2;
        if(n * 2 + 1 <= size && t[x] > t[n * 2 + 1])x = n * 2 + 1;
        if(n != x){
            swap(n, x);
            down(x);
        }
    }
    public static void swap(int a ,int b){
        int temp=t[a];
        t[a] = t[b];
        t[b] = temp;
    }
    
    public static void main(String[] args)throws Exception{
        
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter buw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] params = buf.readLine().split(" ");
        int n = Integer.valueOf(params[0]);
        int m = Integer.valueOf(params[1]);
        size = n;
        String[] nums = buf.readLine().split(" ");
        for(int i = 1; i <= n; ++i){//存储
            t[i] = Integer.valueOf(nums[i - 1]);
        }
        for(int i = n / 2; i != 0; --i){//建堆
            down(i);
        }
        for(int i = 1; i <= m; ++i){//弹出最小值
            buw.write(t[1] + " ");
            t[1] = t[size];
            size--;
            down(1);//重新规整最小堆
        }
        buw.flush();
        buf.close();
        buw.close();
        
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值