`

Java 堆排 (基于数组) 附图解

阅读更多

    堆的定义: 堆是这样一种表,其中每个元素均包含一个键值,表中位置k的元素键值至少与位置2k+1的元素(如果存在)或位置2k+2的元素(如果存在)的键值一样大。

    构建堆的时间复杂度O(n)

    调整堆的时间复杂度O(log2n)

    堆排序时间复杂度O(nlog2n)

    堆排序不稳定

public class HeapSort {
	private void heapify(int arr[],int low, int high){
		int largeIndex;
		int temp=arr[low];
		largeIndex=2*low+1;
		
		while(largeIndex<=high){
			if(largeIndex<high){
				if(arr[largeIndex]<arr[largeIndex+1])
					largeIndex=largeIndex+1;
			}
			if(temp>arr[largeIndex])break;
			else{
				arr[low]=arr[largeIndex];
				low=largeIndex;
				largeIndex=2*low+1;
			}
			arr[low]=temp;
		}
	}
	private void buildHeap(int arr[]){
		int index;
		int length=arr.length;
		for(index=length/2-1;index>=0;index--){
			heapify(arr, index, length-1);
		}
	}
	public void heapSort(int arr[]){
		int lastOutOfOrder;
		int temp;
		int length=arr.length;
		buildHeap(arr);
		for(lastOutOfOrder=length-1;lastOutOfOrder>=0;lastOutOfOrder--){
			temp=arr[lastOutOfOrder];
			arr[lastOutOfOrder]=arr[0];
			arr[0]=temp;
			heapify(arr, 0, lastOutOfOrder-1);
		}
	}
	public static void main(String[] args) {
		HeapSort   hs=new HeapSort();
		int arr[] = { 2, 568, 34, 46, 9, 23, 89, 43, 572, 684, 783, 543 };
		hs.heapSort(arr);
		for (int i = 0; i < 12; i++) {
			System.out.print(arr[i] + ",");
		}
		// 2,9,23,34,43,46,89,543,568,572,684,783,
		
	}
}

 

堆排序的步骤:

1.构建堆

    假定length表示表的长度,令index=length/2-1,那么arr[index]是最后一个非叶节点,

    元素arr[index+1]…arr[legth-1]都是叶节点。

    将包含根节点arr[index]的子树转换为一个堆,然后将包含根节点arr[index-1]的子树转换为一个堆,

    直至把包含根节点arr[0]的数转换成一个堆

2.堆排序

图解:

堆排序

  • 大小: 147.5 KB
分享到:
评论

相关推荐

    非常好的Java入门图解教程

    这个"非常好的Java入门图解教程"旨在帮助初学者轻松踏入Java的世界。本文将深入探讨Java的基础知识,包括语法、类与对象、数据类型、控制结构以及异常处理等方面。 1. **Java基础知识** - **Java开发环境**:首先...

    java笔记图解4

    在“java笔记图解4”中,我们可以期待深入学习到Java的基础概念和关键特性。以下是基于这个主题可能涵盖的一些知识点: 1. **Java环境配置**:安装JDK(Java Development Kit),设置JAVA_HOME环境变量,配置Path...

    8张图解java

    - **Java堆**: 存储所有类的实例和数组。 - **方法区**: 存储每个类的元数据、静态变量、常量池等信息。 以上八个知识点涵盖了Java编程的基础与进阶内容,深入理解这些概念有助于提高代码质量和开发效率。

    图解java 关键

    在本篇中,我们将通过图解的方式深入浅出地探讨Java的一些关键概念,帮助你更直观、更易于理解。 首先,让我们从"Map"开始。Map是Java集合框架中的一个重要接口,它存储键值对,提供一种关联数据的方式。HashMap是...

    java正则表达式详细图解经典案例

    Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的数据匹配、搜索、替换和提取操作。自Java 1.4版本起,`java.util.regex`包被引入,提供了Pattern和Matcher两个核心类来支持正则表达式...

    Java入门很简单教学PPT

    5. **数组**:在Java中,数组是相同类型数据的集合,可以通过索引访问其元素。 6. **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,包含了数据(成员变量)和操作这些数据的方法。 7. **...

    Java分支与合并框架详解.pdf

    Java 分支与合并框架是Java并发编程中一个强大的工具,它允许开发者利用多核处理器的并行计算能力来提升程序的执行效率。该框架的核心类是`ExecutorService`,它是`java.util.concurrent`包下的一个接口,用于管理和...

    Java数据结构和算法中文第二版(1)

    通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择正确的算法 利用数据结构和算法为现实世界的处理过程建模 了解不同的数据结构的优势和弱点,考虑如何利用...

    java实现哈密顿路径,递归和非递归两种方式

    在Java中,可以使用栈或队列来存储待访问的顶点,并维护一个二维数组或集合来记录每个顶点是否已被访问。 在项目中,"HMT"可能是"Hamiltonian Matrix Traverse"的缩写,表示对哈密顿路径的矩阵遍历。在Java代码中,...

    java面试问题集锦

    例如,如果运行程序时输入`java Example "arg1" "arg2"`,那么`args`数组的第一个元素将是`"arg1"`,第二个元素将是`"arg2"`。 ##### &和&&的区别 `&`和`&&`都是逻辑运算符,但它们在短路行为上有所不同: - `&`:...

    适应java零基础与初学者的java学习笔记,总结了javaSE的知识点

    ### 适应java零基础与初学者的java学习笔记 #### Java基本语法 Java的基本语法是初学者接触Java语言的第一步,主要包括以下几个方面: 1. **关键字**:Java中有一些具有特殊含义的单词被称为关键字,例如`public`...

    java经典问题答案

    ##### Path与classpath图解 - **Path**:系统路径,用于指定可执行文件的位置。当在命令行中输入一个可执行文件名时,如果该文件不在当前目录下,系统会在Path环境变量指定的路径中查找。 - **Classpath**:类路径,...

    图解堆排序

    堆排序是一种基于比较的排序算法,它的基本思想是构建一个大顶堆或小顶堆,然后通过交换堆顶元素与末尾元素来逐步得到有序序列。具体步骤如下: 1. 构建大顶堆:从最后一个非叶子节点开始,自底向上、自右向左调整...

    冒泡排序和选择排序的详解(包含图解和java代码)

    假设我们有一个无序的数组`{5, 3, 8, 4, 2}`,下面是其冒泡排序过程的图解: - **第一趟排序**: - 比较5和3,由于5 &gt; 3,交换位置,得到`{3, 5, 8, 4, 2}` - 比较5和8,不交换,得到`{3, 5, 8, 4, 2}` - 比较8...

    生产者 消费者 进程 可视化 java

    总结来说,这个程序设计了一个基于Java的生产者-消费者问题的可视化解决方案,利用多线程和进程同步机制来模拟车库(缓冲区)中数据的生产与消耗过程。通过图形用户界面,用户可以直观地看到生产者和消费者如何在...

    排序算法图解--Document.zip

    在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地重新排列一组...在实际编程中,如Java、Python等语言都提供了内置的排序函数,但在特定场景下,手动实现排序算法可能会带来更高的效率。

    使用Java理解程序逻辑第一章作业答案

    在本资源中,"使用Java理解程序逻辑第一章作业答案"主要涵盖了初学者在学习Java编程时,对于程序逻辑基础的理解和应用。这部分内容是编程学习的基石,它涉及到控制流程、变量、运算符、条件语句和循环结构等基础知识...

    java基于Des对称加密算法实现的加密与解密功能详解

    基于Des对称加密算法实现的Java加密与解密功能详解: 对称加密是加密和解密使用相同密钥的一种加密算法,其特点是加解密速度快,适用于大量数据的加密。DES(Data Encryption Standard)是最早被广泛使用的对称加密...

    java的集合介绍

    ArrayList基于动态数组,它提供了快速的随机访问,但插入和删除元素的速度相对较慢,因为涉及到数组的移动。LinkedList则通过双向链表实现,它的插入和删除操作速度快,但在随机访问元素时效率较低。 Set接口的实现...

Global site tag (gtag.js) - Google Analytics