首页 > 编程语言 >排序算法 - 堆排序

排序算法 - 堆排序

时间:2024-03-28 23:33:58浏览次数:28  
标签:int 堆排序 算法 static array 排序 public

文章目录

目录

文章目录

前言

1 . 堆排序原理

2 . 堆排序实现 

总结


前言

大家好,今天给大家介绍一下常见排序算法中的堆排序(填坑)


1 . 堆排序原理

堆排序是一种基于二叉堆数据结构的排序算法,它利用堆的性质进行排序。堆是一种完全二叉树,分为最大堆和最小堆两种类型。在堆排序中,通常使用最大堆进行排序。

堆排序的基本思想如下:

  1. 将待排序的序列构建成一个最大堆。
  2. 交换堆顶元素(最大元素)和堆中最后一个元素,然后将剩余元素重新调整为最大堆。
  3. 重复以上步骤,直到所有元素都被取出,最终得到一个有序序列。

具体建堆操作请访问http://t.csdnimg.cn/FMnMP介绍的很详细,不再过多赘述了

2 . 堆排序实现 

import java.util.Arrays;

/**
 * 堆排序
 */
public class HeapSort {
    private static final int[] array = { 27,15,19,18,28,34,65,49,25,37 };

    /**
     * 左子节点: 2*i  右字节点 2*i+1
     * @param args
     */
    public static void main(String[] args) {
        sort();
        System.out.println(Arrays.toString(array));
    }

    public static void sort(){
        createHeap();
        System.out.println(Arrays.toString(array));
        for(int i = 0; i<array.length; i++){
            swap(0,array.length-i-1);
            HeapAdjust(0,array.length-1-i-1);
        }
    }

    public static void createHeap(){
        for(int i = array.length/2+1; i>=0; i--){
            HeapAdjust(i,array.length-1);
        }
    }

    public static void HeapAdjust(int start,int end){
        int parent = start;
        int child = 2*parent+1;
        while(child <= end){
            // 找出左右孩子中最大值
            if(child+1 <= end && array[child] < array[child+1]) child++;

            if(array[parent] < array[child]){
                swap(parent,child);
                parent = child;
                child = 2*parent+1;
            }else{
                break;
            }
        }
    }

    public static void swap(int i,int j){
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}

总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

标签:int,堆排序,算法,static,array,排序,public
From: https://blog.csdn.net/weixin_73869209/article/details/137126892

相关文章

  • 【智能算法改进】混沌映射策略--一网打尽
    目录1.引言2.混沌映射3.分布特征4.混沌映射函数调用5.改进智能算法1.引言基本种群初始化是在整个空间内随机分布,具有较高的随机性和分布不均匀性,会导致种群多样性缺乏,搜索效率低等问题。许多学者利用混沌映射机制来增加种群的多样性,以改善算法的性能,其非线性特性......
  • 文件名按数字排序,可以排序多组数字,尤其是99-333~~_222这种复杂数字组合的文件名或字符
    这是我本人编写的一个排序算法,主要就是解决复杂多组数字组合的这种文件名或者字符串的排序,排序主要规则就是从前往后对每一组数据进行排序,效果及截图如下:以下是使用方法:第一步搜索和安装我的Nuget包搜索和安装zmjtool这个包,我写的,如下图:第二步使用HMSorter的Sort方法进行......
  • 选择排序(java)
    选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列解题思路:选择排序的基本思路是遍历整个数组,每次找到剩余部分中的最小值,然后将其与当前位置进行交换。这样每一次遍历都能确定一个元素的最终位置,......
  • 程序员常用的几种算法
    程序员常用的几种算法:排序算法:如快速排序、归并排序、冒泡排序等。这些算法用于对数据进行排序,以便于后续的搜索、查找等操作。搜索算法:如线性搜索、二分搜索等。这些算法用于在数据结构中查找特定的元素。图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra算法......
  • (7-6)行为预测算法:基于Trajectron++模型的行为预测系统
    7.6 基于Trajectron++模型的行为预测Trajectron++是一个用于多目标轨迹预测和规划的深度学习模型,旨在应对自动驾驶和机器人等领域中的挑战,其中多个移动目标需要被准确地预测其未来运动轨迹,以便做出智能决策。7.6.1 Trajectron++模型的特点Trajectron++模型的主要特点和......
  • 拓展欧几里得算法——C.一日之计在于晨
    广州大学第十八届ACM大学生程序设计竞赛(同步赛)C题谈到拓展欧几里得算法,就要从欧几里得算法和裴蜀定理说起。欧几里得算法(辗转相除法)\(gcd(a,b)=gcd(b,a\modb)\)其中,当\(a=0\)时,\(\gcd(a,b)=\gcd(0,b)=b\);\(b=0\)同理证明:\(gcd(a,b)=gcd(b,a-b)\)令\(a=b+c\),\(\gcd(a,b)......
  • 设计算法判断一棵树是否为完全二叉树--c++
    【题目要求】设计算法判断一棵树是否为完全二叉树。【提示】根据完全二叉树的定义可知:1)如果一个结点有右孩子而没有左孩子,那么这棵树一定不是完全二叉树。2)如果一个结点有左孩子,而没有右孩子,那么按照层序遍历的结果,这个结点之后的所有结点都是叶子结点,这棵树才是完全二叉......
  • 高精度算法
    高精度通常,大整数的存储采用数组的形式,其中数组的首位存储大整数的最低位,末位存储最高位举例来说,对于整数123456789,我们可以使用数组存储如下:makefileCopycodeindex:012345678array:[9,8,7,6,5,4,3,2,1]这样,数组的第一......
  • 2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟
    2022TeslaAIDay-特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟附赠自动驾驶学习资料和量产经验:链接人工智能算法犹如电影的主演,我们很多时候看电影只看到主演们的精彩,但其实电影的创意和呈现都来自于背后的导演和制片等团队。而人工智能算法背后的有关数据的软件,设......
  • 每日算法之最长连续序列
    题目描述给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输......