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日

相关文章

  • 图文详解JAVA实现快速排序

    图文详解JAVA实现快速排序 前言 快速排序(Quicksort)是一种常用的排序算法,通过将原数列分为两部分来实现排序。它的时间复杂度为O(nlogn),效率比较高,被广泛应用。 准备工作 在开始之前,我们需要准备一个Java IDE,本文使用的是Eclipse。另外,需要具备Java基础语法的基础知识,如基本数据类型、数组和循环等。 算法流程 快速排序的…

    Java 2023年5月19日
    00
  • android上的一个网络接口和图片缓存框架enif简析

    Android上的一个网络接口和图片缓存框架Enif简析 1. 引言 在Android应用程序中,网络请求和图片缓存是比较重要的功能。然而,由于开发者的经验不同,导致实现这些功能较为困难和繁琐。为了提高开发效率和代码可维护性,开发者不得不使用一些第三方框架。而Enif正是其中一种较为常用的框架。 本文将详细介绍Enif框架,并通过示例代码来演示其常见用法。 …

    Java 2023年5月19日
    00
  • Springboot 2.6集成redis maven报错的坑记录

    首先我们来讲一下 Spring Boot 2.6 集成 Redis 的步骤。 步骤一:添加 Redis 依赖 在 Maven 项目中,我们需要在 pom.xml 文件中添加 Redis 相关依赖。 <dependency> <groupId>org.springframework.boot</groupId> <ar…

    Java 2023年5月19日
    00
  • Springboot工具类StringUtils使用教程

    下面我将为你详细讲解Spring Boot工具类StringUtils的使用教程。 1. StringUtils的介绍 StringUtils是Spring Framework框架中的一个工具类,提供了一系列方便实用的字符串操作方法,如判断普通字符串或者集合是否为空,字符串拼接、截取等等,大大简化了开发人员在字符串操作时的繁琐操作,提高了开发效率。 2. S…

    Java 2023年5月19日
    00
  • springboot 多数据源的实现(最简单的整合方式)

    下面我会详细解释一下“springboot 多数据源的实现(最简单的整合方式)”的攻略。 首先,我们需要了解什么是多数据源。在实际开发中,我们常常需要连接多个数据库,这时候就需要使用到多数据源。在Spring Boot中,实现多数据源的方式非常多,也非常灵活,今天我们将介绍最简单的实现方式。 步骤一:准备工作 在进行多数据源的实现之前,我们需要先做一些准备工…

    Java 2023年5月20日
    00
  • Java实战权限管理系统的实现流程

    下面就详细讲解一下Java实战权限管理系统的实现流程。 目录 前言 权限管理系统实现流程 用户管理 角色管理 权限管理 权限控制 示例说明 总结 前言 权限管理系统是企业级应用系统的一个重要组成部分。Java实战中采用的权限管理系统采用了RBAC(Role-Based Access Control)模型,基于角色的访问控制。 权限管理系统实现流程 下面就是J…

    Java 2023年5月24日
    00
  • JS工厂模式开发实践案例分析

    JS工厂模式开发实践案例分析 什么是JS工厂模式 在JavaScript中,工厂模式是一种用于创建对象的设计模式。工厂模式基于工厂方法,即通过调用工厂方法,返回所需的对象实例。在JavaScript中,这种模式非常常见,因为它可以帮助我们快速创建多个相似的对象。 工厂模式的优缺点 优点 工厂模式可以帮助我们将代码组织得更加清晰和易于管理。 工厂模式允许我们复…

    Java 2023年5月26日
    00
  • python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解

    Python中的print()函数和Java中的System.out.print()都是输出函数,它们都可以向控制台输出内容。下面详细讲解两者的区别以及两者在输出时“+”的功能。 Python中print()函数 语法 print(value1, value2, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=F…

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