广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解如何在Java中实现堆排序算法
  • 617
分享到

详解如何在Java中实现堆排序算法

2024-04-02 19:04:59 617人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录算法描述实现代码测试代码算法描述 堆排序算法的描述如下: 将待排序的数组调整为最大堆,此时未排序的长度 N 为数组的长度,调整的过程就是倒序将数组的前&nbs

算法描述

排序算法的描述如下:

  • 将待排序的数组调整为最大堆,此时未排序的长度 N 为数组的长度,调整的过程就是倒序将数组的前 N/2 个元素下沉的过程,每次下沉都会将较大的元素带到上面,最终将数组变为最大堆;
  • 弹出最大堆的堆顶元素并将其移动到数组的最后面,将原本最后面的元素放到堆顶,然后将未排序的长度 N - 1,调整数组的前 N 个元素为最大堆;
  • 重复步骤 2 直到未排序的长度为 0.

实现代码

package com.zhiyiyo.collection.sort;

import java.util.Arrays;

public class HeapSort extends BaseSort {
    @Override
    public void sort(Comparable[] array) {
        int N = array.length;

        // 创建最大堆
        for (int i = N / 2; i >= 0; i--) {
            sink(array, i, N);
        }

        // 就地排序
        while (N > 0) {
            // 将最大的元素移动到数组的尾部,同时将未排序的长度-1
            swap(array, 0, --N);
            // 调整最大堆
            sink(array, 0, N);
        }
    }

    
    private void sink(Comparable[] array, int k, int N) {
        while (2 * k + 1 < N) {
            int j = 2 * k + 1;
            if (j < N - 1 && less(array[j], array[j + 1])) j++;
            if (!less(array[k], array[j])) break;
            swap(array, k, j);
            k = j;
        }
    }
}

抽象类 BaseSort 的代码为:

package com.zhiyiyo.collection.sort;


public abstract class BaseSort {
    public abstract void sort(Comparable[] array);

    
    protected static void swap(Comparable[] array, int a, int b) {
        Comparable tmp = array[a];
        array[a] = array[b];
        array[b] = tmp;
    }

    protected static boolean less(Comparable a, Comparable b) {
        return a.compareTo(b) < 0;
    }

}

测试代码

package com.zhiyiyo.collection.sort;

import org.junit.Test;

import java.util.Arrays;


public class HeapSortTest {

    @Test
    public void sort() {
        Integer[] array = {5, 10, 9, 6, 8, 7, 2, 1, 4, 3};
        new HeapSort().sort(array);
        System.out.println(Arrays.toString(array));
    }
}

最终排序结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],以上~

到此这篇关于详解如何在Java中实现堆排序算法的文章就介绍到这了,更多相关Java堆排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解如何在Java中实现堆排序算法

本文链接: https://www.lsjlt.com/news/143850.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解如何在Java中实现堆排序算法
    目录算法描述实现代码测试代码算法描述 堆排序算法的描述如下: 将待排序的数组调整为最大堆,此时未排序的长度 N 为数组的长度,调整的过程就是倒序将数组的前&nbs...
    99+
    2022-11-13
  • Java 归并排序算法、堆排序算法实例详解
    基本思想:  归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:合并方法:设r[i…n]由两个有序子表r[i…m...
    99+
    2023-05-31
    java 归并排序 堆排序
  • Java排序算法之堆排序如何实现
    这篇文章主要介绍了Java排序算法之堆排序如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性︰1.父结点的键值总...
    99+
    2023-06-21
  • JAVA十大排序算法之堆排序详解
    目录堆排序知识补充二叉树满二叉树完全二叉树二叉堆代码实现时间复杂度算法稳定性思考总结堆排序 这里的堆并不是JVM中堆栈的堆,而是一种特殊的二叉树,通常也叫作二叉堆。它具有以下特点: ...
    99+
    2022-11-12
  • 怎么在Java项目中实现一个堆排序算法
    怎么在Java项目中实现一个堆排序算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。堆是数据结构中的一种重要结构,了解“堆”的概念和操作,可以帮助我们快速地掌握堆排序。堆的...
    99+
    2023-05-31
    java 堆排序算法 ava
  • Python实现堆排序的方法详解
    本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原...
    99+
    2022-06-04
    详解 方法 Python
  • 详解Java实现拓扑排序算法
    目录一、介绍二、拓扑排序算法分析三、拓扑排序代码实现一、介绍 百科上这么定义的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中...
    99+
    2022-11-12
  • Java详细讲解分治算法如何实现归并排序
    目录1.什么是分治算法分治法基本思想2.分治算法的体现——归并排序归并排序基本思想3.代码实现1.什么是分治算法 分治法 分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两...
    99+
    2022-11-13
  • 图解排序算法之希尔排序Java实现
    目录一、基本思想二、代码实现三、总结一、基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整...
    99+
    2022-11-12
  • Java排序算法之计数排序如何实现
    这篇文章主要为大家展示了“Java排序算法之计数排序如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java排序算法之计数排序如何实现”这篇文章吧。计数排序是非比较的排序算法,用辅助数组对...
    99+
    2023-06-21
  • 详解C++实现拓扑排序算法
    目录一、拓扑排序的介绍二、拓扑排序的实现步骤三、拓扑排序示例手动实现四、拓扑排序的代码实现五、完整的代码和输出展示一、拓扑排序的介绍 拓扑排序对应施工的流程图具有特别重要的作用,它可...
    99+
    2022-11-12
  • Java 选择排序、插入排序、希尔算法实例详解
           1、基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。...
    99+
    2023-05-31
    java 选择排序 插入排序
  • java如何实现快速排序算法
    这篇文章将为大家详细讲解有关java如何实现快速排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路:1.从数列中挑出一个元素,称为...
    99+
    2023-06-02
  • 详解C++实现链表的排序算法
    目录一、链表排序二、另外一种链表排序方式三、比较两种排序的效率四、下面通过交换结点实现链表的排序一、链表排序 最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数...
    99+
    2022-11-12
  • 详细总结各种排序算法(Java实现)
    一、插入类排序1.直接插入排序思想:将第i个插入到前i-1个中的适当位置时间复杂度:T(n) = O(n²)。空间复杂度:S(n) = O(1)。稳定性:稳定排序。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元...
    99+
    2023-05-31
    java 排序算法 ava
  • TypeScript十大排序算法插入排序实现示例详解
    目录一. 插入排序的定义二. 插入排序的流程三. 插入排序的图解四. 插入排序的代码五. 插入排序的时间复杂度六. 插入排序的总结一. 插入排序的定义 插入排序就像是你打扑克牌,你...
    99+
    2023-02-23
    TypeScript插入排序算法 TypeScript 算法
  • Java实现ArrayList排序的方法详解
    目录简介法1:JDK8的stream法2:Comparator#compare()法3:Comparable#compareTo()简介 说明 本文用示例介绍Java的ArrayLi...
    99+
    2022-11-13
  • 如何在java项目中实现一个插入排序算法
    如何在java项目中实现一个插入排序算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、基本概念      插入排序的基...
    99+
    2023-05-31
    java 插入排序 ava
  • web开发中如何实现堆排序
    这篇文章主要为大家展示了“web开发中如何实现堆排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web开发中如何实现堆排序”这篇文章吧。预备知识:堆结构堆是具有以下性质的完全二叉树:每个结点的...
    99+
    2023-06-19
  • java数据结构与算法之桶排序实现方法详解
    本文实例讲述了java数据结构与算法之桶排序实现方法。分享给大家供大家参考,具体如下:基本思想:假定输入是由一个随机过程产生的[0, M)区间上均匀分布的实数。将区间[0, M)划分为n个大小相等的子区间(桶),将n个输入元素分配到这些桶中...
    99+
    2023-05-31
    java 数据结构 算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作