闲时写了一个heap的数据结构,支持最大堆,最小堆。
import java.util.Comparator;
/**
* 堆数据结构
*
* @author Administrator
*
*/
public class Heap<T> {
/**
* 以数组形式存储堆元素
*/
private T[] heap;
/**
* 用于比较堆中的元素。c.compare(根,叶子) > 0。
* 使用相反的Comparator可以创建最大堆、最小堆。
*/
private Comparator<? super T> c;
public Heap(T[] a, Comparator<? super T> c) {
this.heap = a;
this.c = c;
buildHeap();
}
/**
* 返回值为i/2
*
* @param i
* @return
*/
private int parent(int i) {
return (i - 1) >> 1;
}
/**
* 返回值为2*i
*
* @param i
* @return
*/
private int left(int i) {
return ((i + 1) << 1) - 1;
}
/**
* 返回值为2*i+1
*
* @param i
* @return
*/
private int right(int i) {
return (i + 1) << 1;
}
/**
* 堆化
*
* @param i
* 堆化的起始节点
*/
private void heapify(int i) {
heapify(i, heap.length);
}
/**
* 堆化,
*
* @param i
* @param size 堆化的范围
*/
private void heapify(int i, int size) {
int l = left(i);
int r = right(i);
int next = i;
if (l < size && c.compare(heap[l], heap[i]) > 0)
next = l;
if (r < size && c.compare(heap[r], heap[next]) > 0)
next = r;
if (i == next)
return;
swap(i, next);
heapify(next, size);
}
/**
* 对堆进行排序
*/
public void sort() {
// buildHeap();
for (int i = heap.length - 1; i > 0; i--) {
swap(0, i);
heapify(0, i);
}
}
/**
* 交换数组值
*
* @param arr
* @param i
* @param j
*/
private void swap(int i, int j) {
T tmp = heap[i];
heap[i] = heap[j];
heap[j] = tmp;
}
/**
* 创建堆
*/
private void buildHeap() {
for (int i = (heap.length) / 2 - 1; i >= 0; i--) {
heapify(i);
}
}
public void setRoot(T root) {
heap[0] = root;
heapify(0);
}
public T root() {
return heap[0];
}
/**
* 取出最大元素并从堆中删除最大元素。
*
* @param
* @param a
* @param comp
* @return
*/
// public T extractMax(T[] a, Comparator<? super T> comp) {
// if (a.length == 0) {
// throw new
// IllegalArgumentException("can not extract max element in empty heap");
// }
// T max = a[0];
// a[0] = a[a.length - 1];
// heapify(0, a.length - 1);
// return max;
// }
/**
* @param args
*/
public static void main(String[] args) {
Integer[] temp = null;
temp = new Integer[] { 5, 2, 4, 6, 1, 3, 2, 6 };
temp = new Integer[] { 16, 14, 8, 7, 9, 3, 2, 4, 1 };
Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
//创建最大堆
Heap<Integer> heap = new Heap<Integer>(temp, comp);
// heap.buildHeap();
for (int i : temp) {
System.out.print(i + " ");
}
System.out.println();
heap.sort();
for (int i : temp) {
System.out.print(i + " ");
}
System.out.println();
}
}
通过Comparator控制堆的性质(是最大堆还是最小堆)
创建最大堆
Heap<Integer> heap = new Heap<Integer>(topn,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//生成最大堆使用o1-o2,生成最小堆使用o2-o1
return o1-o2;
}
});
创建最小堆
Heap<Integer> heap = new Heap<Integer>(topn,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//生成最大堆使用o1-o2,生成最小堆使用o2-o1
return o2-o1;
}
});
分享到:
相关推荐
数据结构堆排序的java算法实现,里面用java语言实现了堆排序的算法实现,有输入和输出结果
8. **排序算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,这些排序算法的Java实现可以帮助你理解它们的工作原理和效率。 9. **查找算法**:如二分查找、哈希查找等,这些算法在处理大...
堆排序的核心思想是构建一个完全二叉树,即堆,然后通过调整堆结构,使得根节点(最大元素或最小元素)总能处于正确的位置。这个过程分为两个阶段:建堆和交换。 1. **建堆**:首先将待排序的序列构造成一个大顶堆...
以下是Java实现堆排序的基本步骤: 1. 构建大顶堆:从最后一个非叶子节点(即最后一个元素的父节点)开始,自底向上、自右向左进行调整,确保每个节点都大于或等于其子节点。 2. 交换堆顶元素与末尾元素:将最大...
标题中的“DSAA_堆排序java实现_源码”表明这是一个关于数据结构与算法分析(Data Structures and Algorithms Analysis,简称DSAA)的资料包,主要关注堆排序算法的Java实现。堆排序是一种高效的排序算法,它利用了...
在Java中,我们通常会使用数组来模拟这个堆结构。在这个实例中,我们关注的是如何用Java来实现堆排序算法,并通过随机生成的数字进行验证。 首先,了解堆的基本概念。堆分为最大堆和最小堆,最大堆是每个父节点的值...
虽然这里没有明确的堆实现文件,但Java提供了`java.util.PriorityQueue`来实现堆数据结构。 在实际编程中,这些数据结构的选择取决于特定的需求,例如快速访问、高效的插入和删除等。理解并熟练使用这些数据结构...
在Java编程中,堆是一种非常重要的数据结构,它通常用于实现优先队列或者优化排序算法,比如快速排序和堆排序。本篇文章将深入探讨如何在Java中实现堆的建立以及堆的向下和向上调整。 首先,我们需要理解堆的概念。...
以下是一个简单的Java实现: ```java public class Node { int key; Node left, right; public Node(int item) { key = item; left = right = null; } } public class BinarySearchTree { Node root; //...
9. **排序算法**:在Java中实现的各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,都是基于特定数据结构的优化操作。 10. **搜索算法**:深度优先搜索(DFS)和广度优先搜索(BFS)是...
在Java实现中,可以创建一个MaxHeap类,包含以下方法: - `void insert(int value)`:插入一个新元素。 - `int extractMax()`:删除并返回最大元素。 - `void buildHeap(int[] arr)`:将给定数组建立为最大堆。 - `...
数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...
了解和熟练掌握这些数据结构及其Java实现对于提升编程技能和解决实际问题至关重要。通过实践和不断学习,我们可以更有效地设计和优化算法,从而提高程序的性能和效率。在实际项目中,选择合适的数据结构往往能显著...
学习数据结构Java版,你需要理解这些基础概念,熟悉它们的实现原理,并能够根据实际需求选择合适的数据结构。通过实践,你将掌握如何利用Java的数据结构优化算法,提高代码性能,解决复杂问题。
《数据结构(Java版本)》这本书正是为此目的而编写,旨在将理论与实际编程相结合,通过Java语言来实现各种经典的数据结构。 首先,书中的基础部分会介绍数据结构的基本概念,如数组、链表、栈和队列。数组是最基本...
以下将详细介绍标题和描述中涉及的数据结构常考知识点及其Java实现。 1. 线性表: 线性表是最基础的数据结构,包括数组和链表两种形式。在Java中,数组是最直接的线性表实现,可以直接声明并初始化。链表则通过节点...
本篇文章将深入探讨如何用Java语言来实现这种基本的数据结构。 1. **队列的基本操作** - **enqueue()**: 将元素添加到队列的尾部。这是队列的插入操作。 - **dequeue()**: 移除并返回队列的头部元素。这是队列的...
标题提及的是“数据结构java语言描述课后答案”,这通常指的是学生在学习数据结构课程时,针对教材或课堂讲解的习题解答。这些答案涵盖了数据结构的基本概念、逻辑结构、存储结构以及算法的时间和空间复杂度分析。 ...
Java 实现内存动态分配主要涉及Java内存模型以及内存管理...综上所述,Java实现内存动态分配涉及到对堆内存、栈内存的理解,以及对垃圾回收机制的掌握。通过实验模拟,可以更直观地了解这些概念在实际操作中的应用。
《计算机科学丛书·数据结构从应用到实现(Java版)》系统地介绍了数据结构以及数据结构与对象之间的联系。主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例...