Java算法之堆排序代码示例

下面是Java算法之堆排序代码示例的完整攻略:

堆排序算法概述

堆排序是一种利用堆的数据结构所设计的一种基于选择的排序算法。堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。

基本思想是:

  1. 将待排序序列构造成一个堆(大根堆或小根堆);
  2. 将根节点与最后一个节点交换,将交换后的最后一个节点从堆中排除;
  3. 对剩余元素重新建堆,重复步骤2,直至剩余元素个数为1。

Java实现

下面给出Java实现堆排序的代码示例:

public class HeapSort {
    public static void heapSort(int[] arr) {
        int length = arr.length;
        // 构造初始堆
        for (int i = length / 2 - 1; i >= 0; i--) {
            adjustHeap(arr, i, length);
        }
        // 交换堆顶元素和最后一个元素,取出当前最大元素
        for (int i = length - 1; i >= 0; i--) {
            swap(arr, 0, i);
            adjustHeap(arr, 0, i);
        }
    }

    // 调整堆
    public static void adjustHeap(int[] arr, int i, int length) {
        int temp = arr[i];
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            if (arr[k] > temp) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }
        }
        arr[i] = temp;
    }

    // 交换数组中两个下标对应的元素
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = { 10, 5, 2, 3, 9, 6, 11 };
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

上面的代码使用了两个方法来实现堆排序:heapSortadjustHeap

其中,heapSort方法调用adjustHeap方法来构造堆和调整堆的过程。在heapSort方法中,首先构造初始堆,然后每次交换堆顶元素和最后一个元素,并继续调整堆。

adjustHeap方法实现堆的调整,传入的参数i是需要调整的父节点,length是当前堆的长度。堆的调整是递归实现的,其中,temp保存需要调整的父节点的值,k是左子节点的下标。如果右子节点也存在,并且右子节点的值大于左子节点的值,则k指向右子节点,否则k指向左子节点。如果节点k的值大于父节点i的值,则将节点k种的值赋值给节点i,并更新i的值为k的值,继续递归调整。

示例说明

下面给出两个示例说明:

示例一

假设有一个数组arr,其元素为{10, 5, 2, 3, 9, 6, 11},我们希望对其进行排序。我们可以通过调用heapSort方法,来实现对该数组的排序。

int[] arr = { 10, 5, 2, 3, 9, 6, 11 };
heapSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为:[2, 3, 5, 6, 9, 10, 11]

示例二

假设有一个数组arr,其元素为{43, 12, 67, 45, 21, 34},我们希望对其进行排序。我们可以通过调用heapSort方法,来实现对该数组的排序。

int[] arr = { 43, 12, 67, 45, 21, 34 };
heapSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为:[12, 21, 34, 43, 45, 67]

以上就是Java算法之堆排序代码示例的完整攻略,包含了堆排序算法的概述、Java实现、以及两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java算法之堆排序代码示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 基于Spring Data Jest的Elasticsearch数据统计示例

    我来为你详细讲解“基于Spring Data Jest的Elasticsearch数据统计示例”的完整攻略。 一、前言 在讲解具体实现之前,我们需要先了解一些背景知识。Elasticsearch 是目前非常流行的一个开源搜索引擎,具有高速、高伸缩性、分布式、全文搜索、分词等特点,它是基于 Apache Lucene 的实现,使用 Java 开发。Spring…

    Java 2023年5月20日
    00
  • JavaWeb文件上传入门教程

    下面我为你详细讲解JavaWeb文件上传的完整攻略。 一、前置知识 在进行文件上传操作之前,我们需要先掌握以下知识: HTML表单的基本使用方法; HTTP协议中的multipart/form-data; Servlet与JSP的基本使用方法; Java IO流的基本使用方法。 二、文件上传的流程 文件上传一般分为以下几个步骤: 在前端HTML页面中设置文件…

    Java 2023年6月15日
    00
  • 什么是 JIT 编译器?

    以下是关于JIT编译器的完整使用攻略: 什么是JIT编译器? JIT(Just-In-Time)编译器是一种在程序运行时将字节码编译成本地机器码的编译器。JIT编译器可以提高程序的执行速度,因为它可以将热点代码(即经常执行的代码)编译成本地机器码,从而避免了每次执行时都需要解释字节码的开销。 JIT编译器的优点 JIT编译器有以下优点: 提高程序的执行速度:…

    Java 2023年5月12日
    00
  • Sprint Boot @PostMapping使用方法详解

    @PostMapping是Spring Boot中的一个注解,它用于将HTTP POST请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@PostMapping是非常重要的。本文将详细介绍@PostMapping的作用和使用方法,并提供两个示例说明。 @PostMapping的作用 @PostMapping的作用是将HTTP POS…

    Java 2023年5月5日
    00
  • Java常用命令汇总

    Java常用命令汇总攻略 Java是一种高级编程语言,由于其稳定性和跨平台性能备受欢迎,因此成为了许多软件的首选语言。针对Java的常用命令,本文旨在为初学者提供帮助以及提高Java编程效率。下面将对Java常用命令进行详细讲解。 Java编译命令 Java编写的代码在开发完成后需要编译成可执行的文件。下面是Java编译命令的格式和用法: javac [op…

    Java 2023年5月19日
    00
  • java 创建自定义数组

    下面我将为您详细讲解Java创建自定义数组的完整攻略。 创建自定义数组 Java中可以通过定义一个类来自定义一个数组。定义一个数组需要完成以下步骤: 定义数组类 在数组类中定义数组元素的类型、数组长度和下标索引 实现获取、设置和遍历数组元素的方法 定义数组类 定义自定义数组类需要使用Java的面向对象编程思想。一个数组可以看做是一个对象,需要自定义一个数组类…

    Java 2023年5月26日
    00
  • Spark SQL配置及使用教程

    Spark SQL 配置及使用教程 简介 Apache Spark 是一个快速、通用的大数据处理引擎,Spark SQL 是 Spark 的一个组件,支持使用 SQL、HiveQL 和 Scala 进行结构化数据处理。 本文将介绍 Spark SQL 的配置及使用教程,包括 Spark SQL 的配置、数据源加载、表操作、SQL 查询等内容,以及两个具体的示…

    Java 2023年5月19日
    00
  • Spring oxm入门实例

    Spring OXM 简介 Spring OXM 是 Spring Framework 中的一个模块,主要用于支持对象到 XML 和 XML 到对象的互相转换。OXM 是 Object/XML Mapping 的缩写,常用于系统之间的数据传输或存储,例如将 Java 对象序列化为 XML 格式存入数据库或者网络传输,另一方也可以将 XML 格式还原为 Jav…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部