`

Java堆和堆排序代码整理

阅读更多
说明: 对java数据结构中的堆的有关代码整理了一下,以备使用~~~

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());
	}

}
1
2
分享到:
评论

相关推荐

    java版冒泡排序,插入排序,堆排序,快速排序,归并排序,希尔排序,桶排序

    堆排序和快速排序在中大规模数据上表现良好,但快速排序的不稳定性和堆排序的空间复杂度是需要注意的问题;归并排序和希尔排序在稳定性上有优势,而桶排序则对输入数据分布有特定要求。在实际应用中,根据数据特性...

    十大排序算法代码(Java)

    十大排序算法十大排序算法源码,自己整理的,可以直接运行,Java版本

    各种排序的java代码归总

    在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程语言,其在...在学习过程中,通过阅读和实践提供的Java代码,可以更直观地理解每种排序算法的工作原理及其在Java中的实现。

    插入排序的Java代码实现

    通过这个Java代码实现,我们可以了解到插入排序的基本步骤和其实现方式。尽管这个例子没有包含详细的注释或讲解,但是代码的结构清晰,易于理解,对于初学者来说是学习插入排序的一个良好起点。在实际编程中,可以...

    java常见的排序算法源代码

    除了上述算法,Java中还有其他经典的排序算法,如冒泡排序(Bubble Sort)、选择排序(Selection Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)。每种排序算法都有其适用场景和优...

    排序算法全集锦(java代码实现)

    ### 排序算法全集锦(Java代码实现) 本文将详细介绍和分析常见的几种排序算法,并通过Java语言实现这些算法。具体包括冒泡排序、简单选择排序、直接插入排序、希尔排序、归并排序以及快速排序等。每种排序算法都将...

    Java必知的8大排序

    本文将深入探讨Java实现的八大排序算法:直接插入排序、简单选择排序、希尔排序、堆排序、快速排序、冒泡排序、归并排序和基数排序。了解这些排序算法不仅有助于提升编程能力,还能在实际开发中优化代码性能。 1. ...

    Java选择排序算法源码

    在编程领域,排序算法是计算机科学中的基础概念,它们用于整理数据序列,使...在实际开发中,可能会使用更高效的排序算法,如快速排序、归并排序或堆排序等,但了解并能实现选择排序对理解排序算法的工作原理至关重要。

    Java各种排序算法代码

    6. **堆排序**:利用堆这种数据结构进行排序,分为建堆和调整堆的过程。它可以在原地进行排序,且时间复杂度为O(n log n)。 7. **希尔排序**:改进版的插入排序,通过增量序列来划分数据,使得原本需要多次比较的...

    java 语言三种排序 程序

    本篇文章将详细探讨Java中实现插入排序、冒泡排序和选择排序的原理、代码实现及它们的时间和空间复杂度。 首先,我们来看插入排序。插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常整理扑克牌的过程...

    Java实现常用排序算法

    尽管这里提到的"树形选择排序"和"堆排序"尚未实现,但选择排序的基本思想已经在代码中体现。 最后,归并排序是一种采用分治法的排序算法。它将数组分为两半,分别对每一半进行排序,然后将两个已排序的子数组合并成...

    排序算法的Java实现

    3. **堆排序(HeapSort.java)** 堆排序利用了堆这种数据结构。在Java中,可以创建一个最大堆或最小堆,然后将堆顶元素与末尾元素交换,再调整堆,如此反复,直至所有元素都在正确位置。堆排序是原地排序,但最坏情况...

    用Java语言实现的各种排序.doc

    这里也没有堆排序的Java代码,堆排序通常涉及堆的构建、交换堆顶和末尾元素以及堆的调整过程。 9. **SortUtil工具类**: 文档中提到了SortUtil工具类,它可能包含了通用的交换元素方法和其他排序辅助功能,例如交换...

    程序员必须知道的8大排序Java版源代码

    本资源提供了八种经典的排序算法的Java源代码实现,包括直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。下面将对这八大排序算法进行详细介绍。 1. **直接插入排序...

    排序算法总结 实现 Demo (Java)

    堆排序利用了堆这种数据结构。堆是一种特殊的树形数据结构,满足堆的性质:父节点的值总是大于或等于(或小于或等于)其子节点的值。堆排序的主要步骤: - 构建最大(或最小)堆。 - 将堆顶元素(最大或最小元素)与...

    java-排序算法总结

    在编程领域,排序算法是计算机科学中的...了解和掌握这些排序算法的原理和Java实现,能帮助我们更好地解决实际问题,提高代码性能。同时,提供的范文、模板和素材可以作为学习和参考的宝贵资源,帮助初学者快速上手。

    收集整理的java算法大全源码包近百种常见算法的源代码.rar

    - 堆排序:利用堆这种数据结构进行排序,分为建堆和调整堆两个过程。 - 计数排序、桶排序和基数排序:非比较型排序,适用于特定场景。 2. 搜索算法: - 线性搜索:逐个遍历数组,查找目标元素。 - 二分查找:在...

    java实现8大排序算法

    在编程领域,排序算法是数据结构与算法学习中的基础且重要的部分。Java作为一种广泛应用的编程...通过阅读和实践“java实现8大排序算法”中的代码,开发者可以深入理解每种算法的实现细节,并在实际项目中灵活运用。

    java面试优秀代码

    11. **LeetCode题目**:这可能涉及到大量的算法题目,如排序算法(快速排序、归并排序、堆排序)、搜索算法(二分查找、深度优先搜索、广度优先搜索)以及动态规划、图论等问题。 12. **性能优化**:JVM调优、代码...

    用Java实现几种常见的排序算法

    这些排序算法各有特点,如插入排序和冒泡排序适用于小规模数据,选择排序和Shell排序对数据分布敏感,快速排序在平均情况下表现优秀,归并排序和堆排序则保证了稳定性。实际应用中,需根据数据量、稳定性需求以及...

Global site tag (gtag.js) - Google Analytics