`
baby69yy2000
  • 浏览: 187831 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

堆操作

    博客分类:
  • Util
阅读更多
Comparator接口
package MyInterface;

public interface Comparator<T> {
	int compare(T x, T y);
}


package Heap;

import MyInterface.Comparator;

public class Greater<T> implements Comparator<T> {

	public int compare(T x, T y) {
		return -((Comparable<T>)x).compareTo(y);
	}
}


package Heap;

import MyInterface.Comparator;

public class Less<T> implements Comparator<T> {

	public int compare(T x, T y) {
		return ((Comparable<T>)x).compareTo(y);
	}
}


package Heap;

import MyInterface.Comparator;

public class Heaps {

	/**
	 * 建堆
	 */
	public static <T> void pushHeap(T[] arr, int last, T item,
			Comparator<? super T> comp) {

		int currPos, parentPos;
		currPos = last;
		parentPos = (currPos - 1) / 2;
		while (currPos != 0) {
			if (comp.compare(item, arr[parentPos]) < 0) {
				arr[currPos] = arr[parentPos];
				currPos = parentPos;
				parentPos = (currPos - 1) / 2;
			} else
				break;
		}
		arr[currPos] = item;
	}

	/**
	 * 删除操作
	 */
	public static <T> T popHeap(T[] arr, int last, Comparator<? super T> comp) {
		T tmp = arr[0];
		arr[0] = arr[last - 1];
		arr[last - 1] = tmp;
		adjustHeap(arr, 0, last - 1, comp);
		return tmp;
	}
	
	/**
	 * 调整堆
	 */
	private static<T> void adjustHeap(T[] arr, int first, int last, 
			Comparator<? super T> comp) {
		int currPos, childPos;
		T target;
		
		currPos = first;
		target = arr[first];
		childPos = 2 * currPos + 1;
		while(childPos < last) {
			//首先比较左右孩子大小,取大值
			if((childPos + 1 < last) &&
					comp.compare(arr[childPos + 1], arr[childPos]) < 0)
				childPos = childPos + 1;
			//再比较目标值
			if(comp.compare(arr[childPos], target) < 0) {
				arr[currPos] = arr[childPos];
				currPos = childPos;
				childPos = 2 * currPos + 1;
			}else
				break;
		}
		arr[currPos] = target;
	}
	
	/**
	 * 堆的产生
	 * 从位于索引(n-2)/2处的最后一个父结点开始,到位于索引0处的根结点结束,向上
	 * 过滤树中的每个父结点,就可以将n元素数组转换成堆.
	 */
	public static <T> void makeHeap(T[] arr, Comparator<? super T> comp) {
		int heapPos, lastPos;
		lastPos = arr.length;
		heapPos = (lastPos - 2) / 2;
		//heapPos = ((lastPos - 1) - 1) / 2;
		
		while(heapPos >= 0) {
			adjustHeap(arr, heapPos, lastPos, comp);
			heapPos--;
		}
	}
	
	/**
	 * 堆排序
	 * 最大堆以升序对数组进行排序,最小堆以降序.
	 */
	public static <T> void heapSort(T[] arr, Comparator<? super T> comp) {
		Heaps.makeHeap(arr, comp);
		int len = arr.length;
		for(int i = len; i > 1; i--) {
			Heaps.popHeap(arr, i, comp);
		}
	}
}


package Heap;

import MyInterface.Comparator;

public class TestHeap {

	public static void main(String[] args) {
		Integer[] arr = {15, 29, 52, 17, 21, 39, 8},
				  arrA = new Integer[arr.length],
				  arrB = new Integer[arr.length];
		
		Greater<Integer> greater = new Greater<Integer>();
		Less<Integer> less = new Less<Integer>();
		
		for(int i = 0; i < arr.length; i++) {
			Heaps.pushHeap(arrA, i, arr[i], greater);
			Heaps.pushHeap(arrB, i, arr[i], less);
		}
		
		//打印最大堆
		for(int i = 0; i < arrA.length; i++)
			System.out.print(arrA[i] + " "); // 52 21 39 15 17 29 8
		System.out.println();
		
		//打印最小堆
		for(int i = 0; i < arrB.length; i++)
			System.out.print(arrB[i] + " "); // 8 17 15 29 21 52 39
		
		Integer maxValue = Heaps.popHeap(arrA, arrA.length, greater);
		Integer minValue = Heaps.popHeap(arrB, arrB.length, less);
		System.out.println('\n' + "max value is: " + maxValue); // max value is: 52
		System.out.println("min value is: " + minValue); // min value is: 8
		
		// 测试堆排序
		Heaps.heapSort(arrA, greater);
		Heaps.heapSort(arrB, less);
		for (int i = 0; i < arrA.length; i++) {
			System.out.print(arrA[i] + " "); // 8 15 17 21 29 39 52
		}
		System.out.println();
		for (int i = 0; i < arrB.length; i++) {
			System.out.print(arrB[i] + " "); // 52 39 29 21 17 15 8
		}
		
	}

}
分享到:
评论

相关推荐

    数组堆操作,包括堆排序、堆插入、堆删除等

    数组堆操作是计算机科学中数据结构与算法的重要组成部分,主要涉及堆排序、堆插入、堆删除等核心概念。堆是一种特殊的树形数据结构,每个节点都有一个值,并且满足堆的性质:对于最大堆,父节点的值总是大于或等于其...

    php 的二叉堆操作

    此外,理解递归和迭代两种方式对堆操作的影响也是很重要的。 在实际项目中,PHP的二叉堆操作可能会用到例如优先级队列、事件调度、最短路径算法等场景。通过熟悉并掌握二叉堆,程序员能够编写出更高效、更具优化的...

    VC++最大堆的实现

    4. **父节点和子节点索引计算**:为了实现堆操作,我们需要能够快速获取一个节点的父节点和子节点的索引。在完全二叉树中,对于索引为`i`的节点,其父节点的索引为`i/2`(向下取整),左子节点为`2 * i`,右子节点为...

    Python-villoc堆操作的可视化

    villoc-堆操作的可视化

    我写的c++堆操作模板

    该代码支持对堆的各种操作,主要面对学习数据结构的初学者

    完全二叉树,堆操作c语言实现

    内容概要:堆的常用操作,包括创建、销毁、添加、插入、删除、空堆、满堆、堆顶 阅读建议:推荐有一定的数据结构基础,对于c语言敏感性高,对指针学习感兴趣

    堆创建,删除,排序实现

    此外,还可以利用STL提供的`std::priority_queue`容器,它底层就是基于堆实现的,提供了一种更简便的接口来实现堆操作。 总之,理解和掌握堆的创建、删除和排序实现对于IT专业人士来说至关重要,尤其是在解决复杂...

    实验报告 - 堆 .docx

    在存储结构方面,实验可能使用数组来实现顺序存储的堆,因为数组能够方便地访问和交换元素,这是堆操作的关键。堆排序算法通过建立堆,然后反复将堆顶元素与末尾元素交换,最后得到有序序列。 总的来说,这个实验...

    小根堆(二叉堆)实现

    在`woniu_heap`文件中的测试代码,可能包含了各种边界条件和性能测试,以确保堆操作的正确性和效率。这可能包括空堆的处理、重复元素、大数量级元素的插入和删除等场景的测试。 为了优化小根堆的操作,可以采用动态...

    数据结构堆的插入与删除 堆排序

    数据结构在计算机科学中扮演着核心角色,而堆是一种特殊的数据结构,广泛应用于排序、优先队列等场景。本文将详细讲解堆的初始化...在C++中实现堆操作和堆排序,可以充分利用标准库提供的功能,使代码简洁且易于维护。

    堆排序过程的动画演示

    然后,堆排序的主要操作开始。步骤一是构建小顶堆,已经完成。步骤二是通过交换堆顶元素(即最小元素)与最后一个元素,然后重新调整堆,来实现排序。每次调整后,堆顶元素都会是剩余未排序元素中的最小值。这个过程...

    利用堆实现带有文件操作的huffman编译码

    8. **实现细节**:在`利用堆实现带有文件操作的huffman编码.cpp`源文件中,应包含适当的头文件,定义数据结构(如节点类),实现堆操作(如插入、删除最小元素),以及哈夫曼编码和解码的算法。同时,文件操作的代码...

    C# 堆 简单实现

    此外,这个实现还可以作为其他堆操作(如合并堆、调整堆大小等)的基础。 总结一下,C#实现的堆数据结构主要涉及以下知识点: 1. 堆的概念和类型:最大堆和最小堆。 2. 堆的特性:父节点的值大于或等于(最大堆)...

    电子功用-用于训练核电站反应堆操纵员的模拟操作系统

    其主要功能是为操纵员提供一个可以练习和掌握反应堆操作技巧的平台,通过反复的模拟操作,提高他们的应急处理能力和决策能力。 二、模拟操作系统的构成 一个完整的模拟操作系统通常包括以下几个部分: 1. 输入模块...

    堆排序算法实现堆排序

    // 一次拆堆操作 for (int i = n - 1; i &gt;= 0; i--) { // 移动当前根到数组末尾 swap(arr[0], arr[i]); // 调整剩余元素为堆 heapify(arr, i, 0); } } // 打印数组 void printArray(int arr[], int n) { ...

    算法导论斐波那契堆(C#,C++)

    同时,还需要一个堆类来管理所有的堆操作,如插入、删除、合并等。 在压缩包中的"chp19斐波那契堆"文件中,很可能包含了作者对于这两种语言实现斐波那契堆的详细代码示例。通过阅读和理解这些代码,读者可以更深入...

    内部排序-快速和堆

    堆排序的时间复杂度在所有情况下都是O(n log n),但由于堆操作的复杂性,其常数因子比快速排序大,因此在实际应用中,对于小规模数据,快速排序可能更快;但对于大规模数据,堆排序的稳定性使其成为不错的选择。 这...

    二叉堆代码

    这种性质确保了堆的根节点始终是整个树的最大值(最大堆)或最小值(最小堆),从而使得堆操作高效。 二叉堆的实现通常采用数组的方式,因为完全二叉树的特性可以方便地映射到一维数组上。例如,如果根节点在数组中...

    huffman 编码 最小堆实现

    堆操作包括插入、删除和调整,这些操作的时间复杂度通常为O(log n),其中n是堆中节点的数量。 当涉及到文件写入和输出时,哈夫曼编码的应用如下: - **编码阶段**:首先,统计源文件中各字符的频率,构建哈夫曼树...

Global site tag (gtag.js) - Google Analytics