当前位置: 首页 > article >正文

Acwing---838. 堆排序

堆排序

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

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

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

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

数据范围
1 ≤ m ≤ n ≤ 1 0 5 , 1≤m≤n≤10^5, 1mn105

1 ≤ 数列中元素 ≤ 1 0 9 1≤数列中元素≤10^9 1数列中元素109

输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3

2.基本思想

  • 如何手写一个堆?完全二叉树 5个操作
  1. 插入一个数 heap[ ++ size] = x; up(size);
  2. 求集合中的最小值 heap[1]
  3. 删除最小值 heap[1] = heap[size]; size -- ;down(1);
  4. 删除任意一个元素 heap[k] = heap[size]; size -- ;up(k); down(k);
  5. 修改任意一个元素 heap[k] = x; up(k); down(k);

3.代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    static int N = 100010;
    static int[] h = new int[N];
    static int size;

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        for (int i = 1; i <= n; i++) h[i] = sc.nextInt();
        size = n;//初始化size,表示堆里有n 个元素
        for (int i = n / 2; i > 0; i--) down(i);//把堆初始化成小根堆,从二叉树的倒数第二行开始,把数字大的下沉

        while (m-- > 0) {
            System.out.print(h[1] + " ");//小顶堆 最小就是第一个
            h[1] = h[size];//末尾元素上移
            size--;
            down(1);
        }
    }

    private static void down(int u) {
        int min = u;//存储三个结点中存在的最小的结点的下标,初始化为当前结点min
        if (u * 2 <= size && h[u * 2] < h[min]) min = u * 2;//左子节点存在并且小于当前结点,更新min的下标
        if (u * 2 + 1 <= size && h[u * 2 + 1] < h[min]) min = u * 2 + 1;//右子节点存在并且小于当前结点,更新min的下标
        if (min != u) {//如果min==u意味着不用变动,u就是三个结点中拥有最小值的结点下标,否则交换数值
            int temp = h[min];
            h[min] = h[u];
            h[u] = temp;
            down(min);//交换数值后,min这个结点存储原本u的值,u存储存储min的值(三个数中的最小值)。u不用调整了,但min情况不明,可能需要调整。直到它比左右子节点都小
        }
    }
}


http://www.kler.cn/news/234833.html

相关文章:

  • Duilib List 控件学习
  • ubuntu中尝试安装ros2
  • HTML世界之第一重天
  • hexo部署到gitee(码云)
  • C#系列-C#log4net日志保存到文件(15)
  • Bug2- Hive元数据启动报错:主机被阻止因连接错误次数过多
  • 从零开始实现消息队列(二)
  • 【XR806开发板试用】轻松连上华为云实现物联网
  • PLC在物联网中位置—承上启下,与上位机下位机的关联。
  • PyCharm2023.3.2配置conda环境
  • 【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
  • Debezium发布历史123
  • Java语言体系
  • 《动手学深度学习(PyTorch版)》笔记8.5
  • 【UE 游戏编程基础知识】
  • YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测
  • CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)
  • 算法------(11)并查集
  • UVA11021 Tribles
  • 腾讯云4核8G服务器价格,性能如何?
  • Linux操作系统基础(九):Linux用户与权限
  • 字符串的解码--leetcode 394
  • .NET Core 3 foreach中取索引index
  • 《动手学深度学习(PyTorch版)》笔记7.3
  • 【Linux技术宝典】Linux入门:揭开Linux的神秘面纱
  • Python requests模块 快速入门 这篇就够了
  • 中国电子学会2019年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(选择题、判断题)
  • 导入jar包的办法,若Maven报日志错误,Cannnot resolve XXXXX.jar
  • Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目
  • leetcode——滑动窗口题目汇总