- 浏览: 324897 次
- 性别:
- 来自: 西宁
文章分类
- 全部博客 (120)
- Java Thought (29)
- Java Pattern (4)
- Data Base (7)
- Algorithm Design (33)
- Linux (0)
- Mysql (2)
- Oracle (0)
- ConstructionDesign-架构 (5)
- Spring Platform (0)
- Tomcat (1)
- JavaScript (7)
- Web System (3)
- MS SQLServer (1)
- 软件哲学 (6)
- View (3)
- Java GUI (4)
- CSSDIV (7)
- CloudComputing (0)
- WebService (0)
- SystemOrProject (2)
- SOA (0)
- 互转共享 (3)
- 偶尔java习题 (0)
- Thinks with does (1)
最新评论
-
sassds:
佩服啊 高手
分享一款js特效 -
bhjackson:
学习啦,能否详细介绍下回溯的过程?O(∩_∩)O谢谢
分享回溯法- 找n个数中r个数的组合 -
zk7019311:
了解了解。。。。。
业务层代码复用的一点建议 -
lijie1819:
看到LZ的设计思想,感觉和抽象工厂模式有点相像。
业务层代码复用的一点建议 -
wjjcml1982:
酷毙了!楼主太强悍了!
分享一款js特效
说明: 对java数据结构中的堆的有关代码整理了一下,以备使用~~~
1. 堆结点:
2. 堆容器:
3. 堆应用测试
4. 堆排序测试:
1. 堆结点:
package boke.heap; /** * 堆结点 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 * */ public class Node { private int iData; // 结点数据是整型 public Node(int key) { iData = key; } /** * setKey * * @param id */ public void setKey(int id) { iData = id; } /** * getKey * * @return */ public int getKey() { return iData; } }
2. 堆容器:
package boke.heap; /** * 堆 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 * */ public class Heap { private Node[] heapArray; // 堆容器 private int maxSize; // 堆得最大大小 private int currentSize; // 堆得大小 /** * 构造 * * @param _maxSize */ public Heap(int _maxSize) { maxSize = _maxSize; currentSize = 0; heapArray = new Node[maxSize]; } /** * 堆是否为空 * * @return */ public boolean isEmpty() { return currentSize == 0; } /** * 在堆中插入新元素 * * @param key * @return */ public boolean insert(int key) { if (currentSize == maxSize) { return false; } Node newNode = new Node(key); heapArray[currentSize] = newNode; trickleUp(currentSize++); return true; } /** * 堆调整自下而上的调整 * * @param index */ public void trickleUp(int index) { int parent = (index - 1) / 2; Node bottom = heapArray[index]; while (index > 0 && heapArray[parent].getKey() < bottom.getKey()) { heapArray[index] = heapArray[parent]; // 双亲结点值大, 调整 index = parent; parent = (parent - 1) / 2; } heapArray[index] = bottom; // 回送 } /** * 删除堆中最大的值 * * @return */ public Node remove() { Node root = heapArray[0]; heapArray[0] = heapArray[--currentSize]; trickleDown(0); return root; } /** * 自上而下的调整 * * @param index */ public void trickleDown(int index) { int largeChild; Node top = heapArray[index]; // save root while (index < currentSize / 2) { // while node has at least one child int leftChild = 2 * index + 1; int rightChild = leftChild + 1; if (rightChild < currentSize && heapArray[leftChild].getKey() < heapArray[rightChild] .getKey()) { largeChild = rightChild; } else { largeChild = leftChild; } if (top.getKey() >= heapArray[largeChild].getKey()) { break; } heapArray[index] = heapArray[largeChild]; // shift child up index = largeChild; // go down } heapArray[index] = top; // root to index } /** * 改变堆中索引为index处的值 * * @param index * @param newValue * @return */ public boolean change(int index, int newValue) { if (index < 0 || index >= currentSize) { return false; } int oldValue = heapArray[index].getKey(); // remove old heapArray[index].setKey(newValue); // change to new if (oldValue < newValue) { // if raised this.trickleUp(index); // trickle it up } else { // if lowered this.trickleDown(index); // trickle it down } return true; } /** * 按某种格式输出堆 */ public void displayHeap() { System.out.print("heapArray: "); for (int i = 0; i < currentSize; i++) { if (heapArray[i] != null) { System.out.print(heapArray[i].getKey() + " "); } else { System.out.print("-- "); } } System.out.println(); int nBlanks = 32; // heap format int itemsPerRow = 1; int column = 0; int j = 0; // current item String dots = "..............................."; System.out.println(dots + dots); // dotted top line while (currentSize > 0) { // for each heap item if (column == 0) { // first item in row for (int k = 0; k < nBlanks; k++) { // preceding blanks System.out.print(" "); } } System.out.print(heapArray[j].getKey()); // display item if (++j == currentSize) { // done? break; } if (++column == itemsPerRow) { // end of row? nBlanks /= 2; // half the blanks itemsPerRow *= 2; // twice the items column = 0; // start over on System.out.println(); // next row } else { // next item on row for (int k = 0; k < nBlanks * 2 - 2; k++) { System.out.print(' '); // interim blanks } } } System.out.println("\n" + dots + dots); } /** * 输出堆数组 */ public void displayArray() { for (int j = 0; j < maxSize; j++) { System.out.print(heapArray[j].getKey() + " "); } System.out.println(""); } /** * 在堆中的索引index出设置新结点 * * @param index * @param newNode */ public void insertAt(int index, Node newNode) { heapArray[index] = newNode; } /** * 堆的大小增量 */ public void incrementSize() { currentSize++; } }
3. 堆应用测试
package boke.heap; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 堆应用测试 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 * */ public class HeapApp { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { int value, value2; Heap hp = new Heap(31); boolean success; hp.insert(70); hp.insert(40); hp.insert(50); hp.insert(20); hp.insert(60); hp.insert(100); hp.insert(80); hp.insert(30); hp.insert(10); hp.insert(90); while (true) { System.out.print("Enter first letter of "); System.out.print("show, insert, remove, change: "); int choice = getChar(); switch (choice) { case 's': hp.displayHeap(); break; case 'i': System.out.print("Enter value to insert: "); value = getInt(); success = hp.insert(value); if (!success) { System.out.println("Can't insert; heap is full"); } break; case 'r': if (!hp.isEmpty()) { hp.remove(); } else { System.out.println("Can't remove; heap is empty"); } break; case 'c': System.out.print("Enter current index of item: "); value = getInt(); System.out.print("Enter new key: "); value2 = getInt(); success = hp.change(value, value2); if (!success) { System.out.println("Invalid index"); } break; default: System.out.println("Invalid entry\n"); } } } /** * 获得控制台输入流 * * @return * @throws IOException */ public static String getString() throws IOException { return new BufferedReader(new InputStreamReader(System.in)).readLine(); } /** * 获得控制台输入字符 * * @return * @throws IOException */ public static char getChar() throws IOException { return getString().charAt(0); } /** * 获得控制台输入整型 * * @return * @throws NumberFormatException * @throws IOException */ public static int getInt() throws NumberFormatException, IOException { return Integer.parseInt(getString()); } }
4. 堆排序测试:
package boke.heap; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 堆排序测试 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 * */ public class HeapSortApp { /** * @param args * @throws IOException * @throws NumberFormatException */ public static void main(String[] args) throws NumberFormatException, IOException { int size, j; System.out.print("Enter number of items: "); // 输入堆大小 size = getInt(); Heap hp = new Heap(size); for (j = 0; j < size; j++) { // 随机建立堆 int random = (int) (Math.random() * 100); Node newNode = new Node(random); hp.insertAt(j, newNode); hp.incrementSize(); } System.out.print("Random: "); hp.displayArray(); // 输出堆数组 for (j = size / 2 - 1; j >= 0; j--) { hp.trickleDown(j); } System.out.print("Heap: "); // 输出堆 hp.displayArray(); hp.displayHeap(); for (j = size - 1; j >= 0; j--) { Node largestNode = hp.remove(); hp.insertAt(j, largestNode); } System.out.print("Sorted: "); // 输出排序后的数组(升序) hp.displayArray(); } /** * 获得控制台输入流 * * @return * @throws IOException */ public static String getString() throws IOException { return new BufferedReader(new InputStreamReader(System.in)).readLine(); } /** * 获得控制台输入整型 * * @return * @throws NumberFormatException * @throws IOException */ public static int getInt() throws NumberFormatException, IOException { return Integer.parseInt(getString()); } }
发表评论
-
开散列的简单模拟(一)
2010-06-28 08:33 18221. 散列 散列有两种 ... -
递归和动态规划构造两个字符序列的最长公共字符子序列
2010-06-28 08:28 4494应je朋友要求,所以翻开以前的算法题目,整理了以下,给 ... -
最大公约数的应用 - 分享
2010-06-25 08:08 18541.先看一家大公司笔试题 数组中有n个数据,要将它们顺 ... -
信息数字化解逻辑题分享
2010-06-21 08:09 12561. 前提条件: 将逻辑题目中的信息用数字化描述。 ... -
递归算法分析-分享
2010-06-19 16:09 15921. 深入认识递归 (1) 递 ... -
非递归算法分析实例分享
2010-06-18 15:47 10561 仅仅依赖于问题规模的时间复杂度 (1) 例1: 交换i和 ... -
NP完全性问题
2010-06-18 14:02 7014在学习算法设计与分析时,经常会提到NP完全性问题,到底 ... -
算法分析精述分享
2010-06-18 12:03 8721. 算法分析的评价体系 评价算法的三条主要标准是: ... -
贪婪策略算法的总结分享
2010-06-11 08:30 60701. 贪婪算法描述 贪婪算法又叫登山法,它的根本思想是 ... -
带权有向图 - 边上权值非负情形的单源最短路径问题
2010-06-07 08:57 26791. 问题描述: 给定 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)四
2010-06-07 08:54 137021. 工作分配问题。 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)三
2010-06-07 08:53 109317. 字符统计问题。 编写一个算法,统计在一个输入 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)二
2010-06-07 08:47 13668. 数字迷问题。 A B C ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)一
2010-06-07 08:38 11801. 线程问题。 设计4个线程,其中两个线程每次对j增加 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)
2010-06-07 08:37 18811. 线程问题。 设计 ... -
Java快速排序算法整理(二)
2010-05-31 14:04 1033package boke.sort; /** * 快 ... -
Java快速排序算法整理(一)
2010-05-31 13:39 657package boke.sort; /** * 快 ... -
Java最小堆实现
2010-05-31 08:29 58521.堆结点 package boke.heap1; /* ... -
Java插入排序代码整理
2010-05-28 14:44 1252package boke.sort; /** * 插 ... -
Java选择排序代码整理
2010-05-28 14:37 1505package boke.sort; /** * 选 ...
相关推荐
堆排序和快速排序在中大规模数据上表现良好,但快速排序的不稳定性和堆排序的空间复杂度是需要注意的问题;归并排序和希尔排序在稳定性上有优势,而桶排序则对输入数据分布有特定要求。在实际应用中,根据数据特性...
十大排序算法十大排序算法源码,自己整理的,可以直接运行,Java版本
在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程语言,其在...在学习过程中,通过阅读和实践提供的Java代码,可以更直观地理解每种排序算法的工作原理及其在Java中的实现。
通过这个Java代码实现,我们可以了解到插入排序的基本步骤和其实现方式。尽管这个例子没有包含详细的注释或讲解,但是代码的结构清晰,易于理解,对于初学者来说是学习插入排序的一个良好起点。在实际编程中,可以...
除了上述算法,Java中还有其他经典的排序算法,如冒泡排序(Bubble Sort)、选择排序(Selection Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)。每种排序算法都有其适用场景和优...
### 排序算法全集锦(Java代码实现) 本文将详细介绍和分析常见的几种排序算法,并通过Java语言实现这些算法。具体包括冒泡排序、简单选择排序、直接插入排序、希尔排序、归并排序以及快速排序等。每种排序算法都将...
本文将深入探讨Java实现的八大排序算法:直接插入排序、简单选择排序、希尔排序、堆排序、快速排序、冒泡排序、归并排序和基数排序。了解这些排序算法不仅有助于提升编程能力,还能在实际开发中优化代码性能。 1. ...
在编程领域,排序算法是计算机科学中的基础概念,它们用于整理数据序列,使...在实际开发中,可能会使用更高效的排序算法,如快速排序、归并排序或堆排序等,但了解并能实现选择排序对理解排序算法的工作原理至关重要。
6. **堆排序**:利用堆这种数据结构进行排序,分为建堆和调整堆的过程。它可以在原地进行排序,且时间复杂度为O(n log n)。 7. **希尔排序**:改进版的插入排序,通过增量序列来划分数据,使得原本需要多次比较的...
本篇文章将详细探讨Java中实现插入排序、冒泡排序和选择排序的原理、代码实现及它们的时间和空间复杂度。 首先,我们来看插入排序。插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常整理扑克牌的过程...
尽管这里提到的"树形选择排序"和"堆排序"尚未实现,但选择排序的基本思想已经在代码中体现。 最后,归并排序是一种采用分治法的排序算法。它将数组分为两半,分别对每一半进行排序,然后将两个已排序的子数组合并成...
3. **堆排序(HeapSort.java)** 堆排序利用了堆这种数据结构。在Java中,可以创建一个最大堆或最小堆,然后将堆顶元素与末尾元素交换,再调整堆,如此反复,直至所有元素都在正确位置。堆排序是原地排序,但最坏情况...
这里也没有堆排序的Java代码,堆排序通常涉及堆的构建、交换堆顶和末尾元素以及堆的调整过程。 9. **SortUtil工具类**: 文档中提到了SortUtil工具类,它可能包含了通用的交换元素方法和其他排序辅助功能,例如交换...
本资源提供了八种经典的排序算法的Java源代码实现,包括直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。下面将对这八大排序算法进行详细介绍。 1. **直接插入排序...
堆排序利用了堆这种数据结构。堆是一种特殊的树形数据结构,满足堆的性质:父节点的值总是大于或等于(或小于或等于)其子节点的值。堆排序的主要步骤: - 构建最大(或最小)堆。 - 将堆顶元素(最大或最小元素)与...
在编程领域,排序算法是计算机科学中的...了解和掌握这些排序算法的原理和Java实现,能帮助我们更好地解决实际问题,提高代码性能。同时,提供的范文、模板和素材可以作为学习和参考的宝贵资源,帮助初学者快速上手。
- 堆排序:利用堆这种数据结构进行排序,分为建堆和调整堆两个过程。 - 计数排序、桶排序和基数排序:非比较型排序,适用于特定场景。 2. 搜索算法: - 线性搜索:逐个遍历数组,查找目标元素。 - 二分查找:在...
在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程...通过阅读和实践“java实现8大排序算法”中的代码,开发者可以深入理解每种算法的实现细节,并在实际项目中灵活运用。
11. **LeetCode题目**:这可能涉及到大量的算法题目,如排序算法(快速排序、归并排序、堆排序)、搜索算法(二分查找、深度优先搜索、广度优先搜索)以及动态规划、图论等问题。 12. **性能优化**:JVM调优、代码...
这些排序算法各有特点,如插入排序和冒泡排序适用于小规模数据,选择排序和Shell排序对数据分布敏感,快速排序在平均情况下表现优秀,归并排序和堆排序则保证了稳定性。实际应用中,需根据数据量、稳定性需求以及...