- 浏览: 187831 次
- 性别:
- 来自: 自己输入城市...
文章分类
- 全部博客 (128)
- Java (13)
- Util (21)
- IO (1)
- Thread (4)
- Net (0)
- Design Patterns (0)
- Training (4)
- ----------------- (0)
- JS-1 (15)
- JS-3 (7)
- AJAX (3)
- AS (2)
- ------------------- (0)
- HTML (3)
- CSS (3)
- Art (15)
- -------------------- (0)
- RegExp (4)
- --------------------- (0)
- SQL (6)
- Servlet $ JSP (2)
- JDBC (2)
- ---------------------- (0)
- Bird (3)
- Setting (7)
- DL (4)
- PHP (4)
最新评论
-
durong11:
或者直接在函数的中加入:if(head.data.equals ...
我的Java单链表练习 -
durong11:
一种解释是:如果是从头结点insert 直接使用addFrom ...
我的Java单链表练习 -
老肥猴_vi:
谢谢。但是貌似insert函数( public boolean ...
我的Java单链表练习 -
niepeng880208:
支持
List转换成String数组 -
haohao-xuexi02:
EventHelp
幻灯片效果
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 } } }
发表评论
-
优先队列的实现
2008-05-11 05:00 974package Heap; import MyInter ... -
HashSet 类的实现
2008-04-28 16:03 1196package Hash; import MyInter ... -
HashMap类的实现
2008-04-28 12:20 1540package Hash; import java.ut ... -
Hash类的实现
2008-04-27 15:10 840package Hash; import java.util ... -
散列表的设计-->线性探查法
2008-04-24 09:07 1929性能分析: 散列表中条目数的比例较小时,使用线性探查法的效率较 ... -
二叉排序树的TreeMap类设计
2008-04-23 23:29 1955Iterable接口 package MyInterface; ... -
java集合操作
2008-04-23 23:26 3026package Sets; import java.util ... -
二叉排序树的实现
2008-04-20 01:46 1671最适合用STree排序的是不可变类,不可变类的主要特征是它的对 ... -
InorderIterator类的实现
2008-04-07 08:41 956接口的定义: public interface MyItera ... -
BinaryTree遍历练习::表达式树
2008-04-05 14:35 1787package ExpressionTree; import ... -
二叉树遍历
2008-03-31 01:48 1097二叉树的高度 图(1) /**用后根遍历求二叉树的高度*/ ... -
有界队列
2008-03-26 00:14 1007package Queue; import java.uti ... -
Stack练习:: 中缀-后缀表达式
2008-03-21 17:18 1783package Stack.Calculate; imp ... -
链式队列的实现
2008-03-21 17:05 1356package Queue; import java.u ... -
Stack练习:: 十进制正整数转化成二进制
2008-03-17 16:09 1305include "stdio.h" in ... -
顺序栈的实现
2008-03-14 00:16 1091package Stack; /** * 顺序栈的实现 ... -
数据结构 Java循环双向链表
2008-03-08 17:33 3150■ 构造函数 每个构造函数都通过 this 来初始化链接域 p ... -
我的Java单链表练习
2008-03-06 19:14 3034package LinkedList; /** * ... -
我的ArrayList实现
2008-03-04 21:26 1379package ArrayList; /** * < ... -
[转]数据结构 用Java实现单链表
2007-11-28 12:56 17522007-08-24 页面自动刷 ...
相关推荐
数组堆操作是计算机科学中数据结构与算法的重要组成部分,主要涉及堆排序、堆插入、堆删除等核心概念。堆是一种特殊的树形数据结构,每个节点都有一个值,并且满足堆的性质:对于最大堆,父节点的值总是大于或等于其...
此外,理解递归和迭代两种方式对堆操作的影响也是很重要的。 在实际项目中,PHP的二叉堆操作可能会用到例如优先级队列、事件调度、最短路径算法等场景。通过熟悉并掌握二叉堆,程序员能够编写出更高效、更具优化的...
4. **父节点和子节点索引计算**:为了实现堆操作,我们需要能够快速获取一个节点的父节点和子节点的索引。在完全二叉树中,对于索引为`i`的节点,其父节点的索引为`i/2`(向下取整),左子节点为`2 * i`,右子节点为...
villoc-堆操作的可视化
该代码支持对堆的各种操作,主要面对学习数据结构的初学者
内容概要:堆的常用操作,包括创建、销毁、添加、插入、删除、空堆、满堆、堆顶 阅读建议:推荐有一定的数据结构基础,对于c语言敏感性高,对指针学习感兴趣
此外,还可以利用STL提供的`std::priority_queue`容器,它底层就是基于堆实现的,提供了一种更简便的接口来实现堆操作。 总之,理解和掌握堆的创建、删除和排序实现对于IT专业人士来说至关重要,尤其是在解决复杂...
在存储结构方面,实验可能使用数组来实现顺序存储的堆,因为数组能够方便地访问和交换元素,这是堆操作的关键。堆排序算法通过建立堆,然后反复将堆顶元素与末尾元素交换,最后得到有序序列。 总的来说,这个实验...
在`woniu_heap`文件中的测试代码,可能包含了各种边界条件和性能测试,以确保堆操作的正确性和效率。这可能包括空堆的处理、重复元素、大数量级元素的插入和删除等场景的测试。 为了优化小根堆的操作,可以采用动态...
数据结构在计算机科学中扮演着核心角色,而堆是一种特殊的数据结构,广泛应用于排序、优先队列等场景。本文将详细讲解堆的初始化...在C++中实现堆操作和堆排序,可以充分利用标准库提供的功能,使代码简洁且易于维护。
然后,堆排序的主要操作开始。步骤一是构建小顶堆,已经完成。步骤二是通过交换堆顶元素(即最小元素)与最后一个元素,然后重新调整堆,来实现排序。每次调整后,堆顶元素都会是剩余未排序元素中的最小值。这个过程...
8. **实现细节**:在`利用堆实现带有文件操作的huffman编码.cpp`源文件中,应包含适当的头文件,定义数据结构(如节点类),实现堆操作(如插入、删除最小元素),以及哈夫曼编码和解码的算法。同时,文件操作的代码...
此外,这个实现还可以作为其他堆操作(如合并堆、调整堆大小等)的基础。 总结一下,C#实现的堆数据结构主要涉及以下知识点: 1. 堆的概念和类型:最大堆和最小堆。 2. 堆的特性:父节点的值大于或等于(最大堆)...
其主要功能是为操纵员提供一个可以练习和掌握反应堆操作技巧的平台,通过反复的模拟操作,提高他们的应急处理能力和决策能力。 二、模拟操作系统的构成 一个完整的模拟操作系统通常包括以下几个部分: 1. 输入模块...
// 一次拆堆操作 for (int i = n - 1; i >= 0; i--) { // 移动当前根到数组末尾 swap(arr[0], arr[i]); // 调整剩余元素为堆 heapify(arr, i, 0); } } // 打印数组 void printArray(int arr[], int n) { ...
同时,还需要一个堆类来管理所有的堆操作,如插入、删除、合并等。 在压缩包中的"chp19斐波那契堆"文件中,很可能包含了作者对于这两种语言实现斐波那契堆的详细代码示例。通过阅读和理解这些代码,读者可以更深入...
堆排序的时间复杂度在所有情况下都是O(n log n),但由于堆操作的复杂性,其常数因子比快速排序大,因此在实际应用中,对于小规模数据,快速排序可能更快;但对于大规模数据,堆排序的稳定性使其成为不错的选择。 这...
这种性质确保了堆的根节点始终是整个树的最大值(最大堆)或最小值(最小堆),从而使得堆操作高效。 二叉堆的实现通常采用数组的方式,因为完全二叉树的特性可以方便地映射到一维数组上。例如,如果根节点在数组中...
堆操作包括插入、删除和调整,这些操作的时间复杂度通常为O(log n),其中n是堆中节点的数量。 当涉及到文件写入和输出时,哈夫曼编码的应用如下: - **编码阶段**:首先,统计源文件中各字符的频率,构建哈夫曼树...