java 堆排序代码(最小堆)

package com.juxuny.heap;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Juxuny on 2015/2/10.
 */
public class Heap {

    private int MAX = 2 << 20;
    private Node[] arr;
    private int size = 0;

    public Heap() {
        arr = new Node[MAX];
    }

    public int add(Node n) {
        if (size == 0 ) {
            arr[size ++] = n;
            return 0;
        }
        if (size >= MAX) return -1;
        Node tmp ;
        arr[size ++] = n;
        int j = size - 1;
        for (int i = (size -1) >> 1; i >= 0 ; i = (i - 1 ) >> 1) {
            if (arr[j].compare(arr[i])) {
                tmp = arr[j];
                arr[j] = arr[i];
                arr[i] = tmp;
            }
            j = i;
        }
        return 0;
    }

    public Node pop() {
        Node ret = null;
        if (size == 0 ) return ret;
        ret = arr[0];
        Node tmp = arr[--size];
        int i = 0;
        for (i = 0 ; i < size >> 1; ) {
            int child = i << 1 | 1;
            int right = child + 1;
            if (right < size && arr[right].compare(arr[child])) child = right;
            if (tmp.compare(arr[child])) break;
            arr[i] = arr[child];
            i = child;
        }
        arr[i] = tmp;
        return ret;
    }

    public Node top() {
        if (size == 0 ) return null;
        return arr[0];
    }
}
import com.juxuny.heap.Heap;
import com.juxuny.heap.Node;

import java.util.Random;

/**
 * Created by Juxuny on 2015/2/10.
 */
public class Main {
    public static void main(String[] args) {
        Random random = new Random();
        Heap heap = new Heap();
        for (int i = 0 ; i < 1000; i ++ ) {
            heap.add(new MinNode(random.nextInt(10000)));
        }
        MinNode minNode = (MinNode) heap.pop();
        while (minNode != null ) {
            System.out.printf("%d ", minNode.time);
            minNode = (MinNode) heap.pop();
        }
    }

    public  static class MinNode extends Node {

        public long time;

        public MinNode(long time) {
            this.time = time;
        }

        @Override
        public boolean compare(Node n) {
            return time < ((MinNode)n).time;
        }
    }
}
时间: 2024-10-20 21:31:47

java 堆排序代码(最小堆)的相关文章

Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个heap,一个是最小堆,一个是最大堆. 2.一直使maxHeap的size大于minHeap. 3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到minHeap.并且把minHeap的最小值移动到maxHeap. ...具体看代码 1 /*********

《徐徐道来话Java》:PriorityQueue和最小堆

在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足最小堆的要求,那么,堆顶(根节点)也就是整个序列的最小元素. 最小堆的例子如下图所示: 可以注意到,20的两个子节点31.21,和它们的叔节点30并没有严格的大小要求.以广度优先的方式从根节点开始遍历,可以构成序列: [10,20,30,31,21,32,70] 反过来,可以推演出,序列构成二叉树的

最小堆和最大堆的JAVA实现

/** * 文件名:BinaryHeap.java * 时间:2014年11月3日下午7:15:34 * 作者:修维康 */ package chapter6; import java.util.*; /** * 类名:BinaryHeap 说明:建立一个最小堆 */ class MinHeap<AnyType extends Comparable<? super AnyType>> { private int currentSize; private static final i

java实现最小堆

1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆. 2.最小堆实现: 插入: 1)  将新插入的元素,放置到队列的尾部. 2)  若该元素小于其父节点,两个元素互换.(上移操作) 3)  迭代,直至该元素没有父节点或小于其父节点. 删除: 1)  移掉顶部的节点. 2)  将队末的元素放置到顶部. 3)  该节点与其子节点中较小的那个比

最大堆,最小堆及堆排序

基本概念: 1.完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树. 2.满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值. 定义: 1.堆是一颗完全二叉树: 2.堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值. 3.堆中每个结点的子树都是堆树. 堆的数据结构如下: struct MaxHeap { EType *heap; //存放数据的空间,下标从1开始存储数据,下标为0的作为工作空间,存储

java最小堆实现优先权队列和求最大的n个数问题

堆在实现优先权队列和求最大最小的n个数问题上,有着莫大的优势! 对于最大堆和最小堆的定义此处不再赘述,课参考网上文章:http://blog.csdn.net/genios/article/details/8157031 本文主要是对最小堆进行实现和应用,仅供新手参考. 优先权队列 优先权队列是一种非常有用的数据结构,操作系统的进程调度就有优先权队列的应用,如果用最小值表示最高的优先权,则使用最小堆,否则使用最大堆. top-N值为问题: 对于求最大的n个数,可以用最小堆来实现,思路是:将n个数

最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码

堆(优先队列)priority queue特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而出元素进入队列的先后顺序操作:查找最大值(最小值),删除(最大值) 数组:链表:有序数组:有序链表: 采用二叉搜索树? NO 采用完全二叉树 YES堆的连个特性结构性:用数组表示的完全二叉树:有序性:任一结点的关键字是其字树所有结点的最大值(或最小值) 最大堆(MaxHeap)也称大顶堆:最大值 最小堆(MinHeap)也称"小顶堆":最小值 从根节点到任意结点路径上结点序列的有序性

Java最小堆解决TopK问题

TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的关键词. 对于这个问题,解决方法有很多: 方法一:对源数据中所有数据进行排序,取出前K个数据,就是TopK. 但是当数据量很大时,只需要k个最大的数,整体排序很耗时,效率不高. 方法二:维护一个K长度的数组a[],先读取源数据中的前K个放入数组,对该数组进行升序排序,再依次读取源数据第K个以后的数据

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres