2022-08-09 堆

如何手写一个堆

  • 1、插入一个数
  • 2、求集合当中的最小值
  • 3、删除最小值
  • 4、删除任意一个元素
  • 5、修改任意一个元素
1、heap[size ++] = x;
2、求集合当中最小值
return heap[1]
3、删除最小值
heap[1] = heap[size];
size --;
down(1);
4、删除任意一个元素
heap[k] = heap[size]; 
size --;
变小的话:up(k);
变大的话 :down(k);
或者 直接down(k), up(k); 肯定只会执行一次
5、修改任意一个元素
heap[k] = x;
down(k); 
up(k);
只会执行一次

堆排序

只用到了取最小值,以及删除最小值,所以只实现down 就ok了;

import java.util.*;
public class Main{
    static int N = 100010;
    static int []h = new int [N];
    static int n, m;
    static void down(int u){
        int t = u;
        if(u * 2 <= n && h[u * 2] < h[t]) t = u * 2;
        if(u * 2 + 1 <= n && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
        if(t != u){
            int swap = h[u];
            h[u] = h[t];
            h[t] = swap;
            down(t);
        }
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        for(int i = 1; i <= n; i ++) h[i] = sc.nextInt();
        //建堆的方式;
        for(int i = n / 2; i > 0; i --) down(i);
        while( m -- > 0){
            System.out.print(h[1] + " ");
            h[1] = h[n --];
            down(1);
            
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、堆是什么?什么是小根堆? 堆其实就是一棵完全二叉树,那么什么是完全二叉树,如下图: 一棵深度为k的有n个结点的...
    合情合理合法阅读 459评论 0 0
  • 堆 不是STL里面的堆,而是手写堆。 堆最基本的操作: 堆集合中插入一个数 求集合中的最小值 删除集合中的最小值 ...
    FennL阅读 200评论 0 0
  • 本篇有单链表,双链表,栈,队列,单调栈,单调队列,KMP,Trie,并查集,堆,哈希表,C++STL的内容~以下都...
    是过过呀阅读 431评论 0 3
  • 第一节1、链表与邻接表2、栈与队列3、Kmp 一、链表 1、单链表 : 邻接表邻接表作用 存储图和树2、双链表 用...
    帝冰_genxi阅读 263评论 0 2
  • 原文地址:http://theory.stanford.edu/~amitp/GameProgramming/ 1...
    达微阅读 19,651评论 0 28