`

数据结构之HeapSort

 
阅读更多
package com.pskfire.sort;

// heapSort.java
// demonstrates heap sort
// to run this program: C>java HeapSortApp
import java.io.*;

////////////////////////////////////////////////////////////////
class Node {
	private int iData; // data item (key)

	// -------------------------------------------------------------

	public Node(int key) // constructor
	{
		iData = key;
	}

	// -------------------------------------------------------------
	public int getKey() {
		return iData;
	}
	// -------------------------------------------------------------
} // end class Node
// //////////////////////////////////////////////////////////////

class Heap {
	private Node[] heapArray;
	private int maxSize; // size of array
	private int currentSize; // number of items in array

	// -------------------------------------------------------------

	public Heap(int mx) // constructor
	{
		maxSize = mx;
		currentSize = 0;
		heapArray = new Node[maxSize];
	}

	// -------------------------------------------------------------
	public Node remove() // delete item with max key
	{ // (assumes non-empty list)
		Node root = heapArray[0];
		heapArray[0] = heapArray[--currentSize];
		trickleDown(0);
		return root;
	} // end remove()
		// -------------------------------------------------------------

	public void trickleDown(int index) {
		int largerChild;
		Node top = heapArray[index]; // save root
		while (index < currentSize / 2) // not on bottom row
		{
			int leftChild = 2 * index + 1;
			int rightChild = leftChild + 1;
			// find larger child
			if (rightChild < currentSize && // right ch exists?
					heapArray[leftChild].getKey() < heapArray[rightChild]
							.getKey())
				largerChild = rightChild;
			else
				largerChild = leftChild;
			// top >= largerChild?
			if (top.getKey() >= heapArray[largerChild].getKey())
				break;
			// shift child up
			heapArray[index] = heapArray[largerChild];
			index = largerChild; // go down
		} // end while
		heapArray[index] = top; // root to index
	} // end trickleDown()
		// -------------------------------------------------------------

	public void displayHeap() {
		int nBlanks = 32;
		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(' ');
			// display item
			System.out.print(heapArray[j].getKey());

			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(); // new row
			} else
				// next item on row
				for (int k = 0; k < nBlanks * 2 - 2; k++)
					System.out.print(' '); // interim blanks
		} // end for
		System.out.println("\n" + dots + dots); // dotted bottom line
	} // end displayHeap()
		// -------------------------------------------------------------

	public void displayArray() {
		for (int j = 0; j < maxSize; j++)
			System.out.print(heapArray[j].getKey() + " ");
		System.out.println("");
	}

	// -------------------------------------------------------------
	public void insertAt(int index, Node newNode) {
		heapArray[index] = newNode;
	}

	// -------------------------------------------------------------
	public void incrementSize() {
		currentSize++;
	}
	// -------------------------------------------------------------
} // end class Heap
// //////////////////////////////////////////////////////////////

class HeapSortApp {
	public static void main(String[] args) throws IOException {
		int size, j;

		System.out.print("Enter number of items: ");
		size = getInt();
		Heap theHeap = new Heap(size);

		for (j = 0; j < size; j++) // fill array with
		{ // random nodes
			int random = (int) (java.lang.Math.random() * 100);
			Node newNode = new Node(random);
			theHeap.insertAt(j, newNode);
			theHeap.incrementSize();
		}

		System.out.print("Random: ");
		theHeap.displayArray(); // display random array

		for (j = size / 2 - 1; j >= 0; j--)
			// make random array into heap
			theHeap.trickleDown(j);

		System.out.print("Heap:   ");
		theHeap.displayArray(); // dislay heap array
		theHeap.displayHeap(); // display heap

		for (j = size - 1; j >= 0; j--) // remove from heap and
		{ // store at array end
			Node biggestNode = theHeap.remove();
			theHeap.insertAt(j, biggestNode);
		}
		System.out.print("Sorted: ");
		theHeap.displayArray(); // display sorted array
	} // end main()
		// -------------------------------------------------------------

	public static String getString() throws IOException {
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		return s;
	}

	// -------------------------------------------------------------
	public static int getInt() throws IOException {
		String s = getString();
		return Integer.parseInt(s);
	}
	// -------------------------------------------------------------
} // end class HeapSortApp
// //////////////////////////////////////////////////////////////
分享到:
评论

相关推荐

    蓝桥杯基础数据结构

    【标题】"蓝桥杯基础数据结构"涵盖了在信息技术竞赛如蓝桥杯中常见的核心数据结构知识。数据结构是计算机科学的基础,它涉及到如何高效地组织和存储数据,以便进行有效的检索和处理。本主题主要关注几种关键的数据...

    堆排序 heapsort

    堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆可以分为大...

    Java 数据结构 面试用

    在准备Java面试的过程中,数据结构是必不可少的知识领域。数据结构是计算机存储、组织数据的方式,它直接影响到程序的效率和性能。本资料包主要聚焦于Java实现的数据结构,旨在帮助面试者深入理解并掌握这些核心概念...

    sort-使用C++实现的排序算法之HeapSort.zip

    HeapSort利用了二叉堆的数据结构特性来实现排序,其过程分为两个主要阶段:构建最大(或最小)堆和交换堆顶元素。 **1. 堆的概念** 堆是一种特殊的树形数据结构,每个父节点的值都大于或等于(对于最大堆)或小于或...

    数据结构_C语言_严蔚敏_排序

    严蔚敏教授和吴伟民教授的《数据结构》教材是一本经典之作,它详细介绍了各种数据结构及其算法。排序是数据结构中的基础操作,广泛应用于各种计算问题,如数据库管理、数据分析、计算机图形学等领域。 以下是压缩包...

    数据结构堆排序

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。堆排序是一种基于比较的排序算法,它的效率高且实现简单。在本文中,我们将深入探讨堆排序的原理,以及如何在实际编程中实现它。 首先,我们...

    北京大学2000年数据结构考研试题.doc

    数据结构是计算机科学中的核心课程,它探讨了如何有效地组织和管理数据,以便于高效地执行各种操作。这篇文档是北京大学2000年的数据结构考研试题,涵盖了多个关键概念和算法。 首先,简述的概念包括哈希树、完全...

    清华邓俊辉数据结构

    ### 清华邓俊辉数据结构 #### 一、绪论与课程介绍 根据提供的文件信息,本课程是由清华大学的邓俊辉教授所编写的关于数据结构与算法的教材,该教材采用C++语言实现。从目录来看,本书涵盖了数据结构与算法的基础...

    heapsort.rar

    堆排序是一种高效的排序算法,基于完全二叉树的特性实现。在这个"heapsort.rar"压缩包中,包含了一个名为"heapsort.cpp"的源代码文件,这...同时,堆排序的思想也被广泛应用于其他数据结构和算法设计中,如优先队列等。

    java 数据结构之堆排序(HeapSort)详解及实例

    Java 数据结构之堆排序(HeapSort)详解及实例 堆排序是一种常用的排序算法,它将数组分为大根堆和小根堆,并利用堆的性质对数组进行排序。在 Java 中,堆排序可以通过构建最大堆、选择堆顶元素、交换堆顶元素与第 ...

    DataStructure_Heap_heapsort_heap_Datastructure_made_

    标签中的"heap"是指堆数据结构,"heapsort"是基于堆的排序算法,而"Datastructure made"可能指的是使用C++语言自制的堆数据结构。在压缩包中的"DS_Lab_08_Homework.sln"可能是Visual Studio的一个解决方案文件,包含...

    09 HeapSort.zip

    《严蔚敏数据结构与算法:HeapSort深度解析》 在计算机科学中,数据结构与算法是编程的基础,其中排序算法扮演着至关重要的角色。HeapSort(堆排序)是一种基于比较的排序算法,由Napier和Rabin于1964年提出,后经...

    浙江大学高级数据结构课件(全)

    《浙江大学高级数据结构课件》是一份非常宝贵的教育资源,它涵盖了数据结构这一计算机科学核心领域的深入知识。数据结构是编程和算法设计的基础,对于任何希望在IT领域有所建树的人来说,都是不可或缺的一部分。这份...

    数据结构与算法期末考试试卷

    1. 堆排序(HEAPSORT):堆排序是一种基于比较的排序算法,它利用了堆这种数据结构。题目要求展示在数组A = [5, 13, 2, 25, 7, 17, 20, 8, 4]上进行堆排序的过程。堆排序通常分为建堆和调整堆两步,先将数组转换为大...

    c语言实现堆排序算法 heapsort

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο...

    C#数据结构、排序算法实现(内含使用实例)

    在编程领域,数据结构和排序算法是至关重要的基础,它们对于优化程序性能和解决复杂问题起着关键作用。本文将围绕C#语言,详细讲解数据结构的实现以及各种排序算法的应用,结合具体实例来帮助读者深入理解。 首先,...

    数据结构演示软件

    数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法...

    数据结构课程设计五——排序算法综合分析.doc

    数据结构课程设计五——排序算法综合分析 该资源是一个数据结构课程设计的五个部分,主要讲解排序算法的综合分析。该资源涵盖了多种排序算法,包括直接插入排序、希尔排序、快速排序、冒泡排序、堆排序和归并法排序...

    09 HeapSort.rar

    **堆排序(HeapSort)**是计算机科学中一种重要的排序算法,尤其在数据结构与算法的学习中占据着核心地位。这个名为“09 HeapSort”的压缩包文件,显然包含了关于堆排序的具体实现,很可能是严蔚敏教授的数据结构课程...

Global site tag (gtag.js) - Google Analytics