死磕排序算法之堆排序

本文详细介绍了堆排序算法,包括堆的概念、堆排序的工作原理及其具体实现步骤。通过实例演示了如何将一个数组转换成最大堆,并逐步调整得到有序序列。同时提供了完整的Java实现代码。

介绍

堆排序就是利用堆这种数据结构来实现的一种排序算法,平均时间复杂度为O(nlogn),空间复杂度为O(1)

堆是一种完全二叉树,即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入

堆有堆序性,每个结点的值都大于或等于其左右孩子的值,称为大顶堆,每个结点的值都小于或等于其左右孩子的值,称为小顶堆。

图形演示

heapsort

这里Youtobe上有个讲heap sort的两份钟视频,讲的挺不错,我将它下载下来传到优酷上面了,名叫堆排序

算法实例分析

假设一个数组为[1,12,9,5,6,10]

heap

将其变为最大堆,过后将堆顶元素与堆尾元素进行互换,互换后重新调整堆结构。后续过程,继续交换,调整,最后得到有序序列,下面是图形演示。

heap sort

算法源代码

package com.pjmike.sort;

import java.util.Arrays;

/**
 * 堆排序
 *
 * @author pjmike
 * @create 2018-08-06 11:14
 */
public class HeapSort {
    public static void main(String[] args) {
        int[] arr = new int[]{2, 3, 2, 5, 8, 4, 9, 0};
        create(arr);
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 建立堆
     *
     * @param arr
     */
    static void create(int[] arr) {
        int n = arr.length;
        System.out.println("n: " + n);
        for (int i = n / 2 - 1; i >= 0; i--) {
            System.out.println("i值:" + i);
            heapify(arr, n, i);
        }
    }

    /**
     * 堆排序
     *
     * @param arr
     */
    static void heapSort(int[] arr) {
        int n = arr.length;
        for (int i = n - 1; i >= 0; i--) {
            //交换堆顶和堆尾元素
            swap(arr, 0, i);
            //此时堆的Length为i,将已调整的元素抛开在外,重新对堆进行调整使其成为最大堆
            heapify(arr, i, 0);
        }
    }

    /**
     * 建立最大堆
     *
     * @param arr
     * @param i
     */
    static void heapify(int[] arr, int n, int i) {
        int largest = i;
        //左子树编号
        int left = 2 * i + 1;
        //右子树编号
        int right = 2 * i + 2;
        //如果左子树的值比结点的值大,就交换左子树和结点的值
        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }
        //如果右子树的值比此时的arr[largest]值大,就相互交换值
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }
        //如果largest还是==i,说明父节点的值比两边子树的值都大
        if (largest != i) {
            swap(arr, largest, i);
            //递归进行下一轮
            heapify(arr, n, largest);
        }
    }

    /**
     * 交换数组元素
     *
     * @param arr
     * @param a
     * @param b
     */
    public static void swap(int[] arr, int a, int b) {
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
}
<think>嗯,用户想找关于Abaqus的学习笔记和B站的视频教程。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的资料。引用[1]提到了HyperMesh的新界面教程,但用户可能更需要Abaqus的内容。引用[2]直接提到了Abaqus软件的使用笔记,里面还有修改背景颜色、去除文字、输出图片和动画的方法,这个应该有用。引用[3]是关于搅拌摩擦焊的仿真分析,虽然涉及Abaqus,但主要是特定案例的应用,可能不够基础。 用户之前的问题是关于查找Abaqus的笔记和视频教程,所以我需要整理这些信息。首先,引用[2]中的B站视频链接BV1Ed4y15721是修改背景和视图设置的教程,适合基础操作。然后,引用[3]提到的搅拌摩擦焊仿真可能对高级用户有帮助,但可能需要先掌握基础。另外,用户可能还需要更多的资源,比如官方教程或更多B站视频推荐。 接下来,考虑用户的需求可能有不同层次:基础操作、建模、仿真分析等。需要分门别类地推荐,比如基础入门、建模技巧、案例分析和进阶专题。同时,要确保推荐的视频链接有效,并且注明来源,比如李建工程师的视频在引用[1]中提到的内容,虽然主要是HyperMesh,但可能有部分Abaqus相关内容? 另外,用户可能对如何高效学习Abaqus有疑问,所以提供学习路径建议会更好。比如先学界面操作,再学建模,最后进行复杂仿真。同时,提醒用户注意软件版本差异,避免操作不一致的问题。 还需要检查是否有其他相关引用被遗漏,但根据提供的引用,主要相关信息在引用[2]和[3]。可能需要补充一些常见的Abaqus学习资源,比如官方文档、论坛或书籍,但用户特别提到B站视频,所以重点放在视频教程上。 最后,生成相关问题,帮助用户深入探索,比如软件版本差异、建模技巧、常见错误处理等。确保回答结构清晰,分点明确,便于用户一步步查找所需资料。</think>根据您对Abaqus学习资料的需求,结合B站视频资源及站内引用内容,整理以下系统化学习路径建议: ### 一、基础操作与界面设置 1. **视图定制化**:通过修改背景色、隐藏注释文字等操作提升操作界面清晰度 - 操作路径:`View -> Graphics Options`修改渐变色为纯色[^2] - 隐藏网格显示:`Common Plot Options`设置模型显示模式[^2] - 推荐视频:BV1Ed4y15721(界面基础设置专题教程) 2. **结果输出规范** ```python # 伪代码示例:Abaqus动画输出控制逻辑 def create_animation(): set_viewport_config() # 设置视口参数 define_output_format('avi') # 指定输出格式 adjust_frame_rate(24) # 调整帧率 execute_render() # 执行渲染 ``` 对应视频教程中详细演示了图片与动画的输出流程[^2] ### 二、建模与装配技巧 1. **复合运动实现**:针对搅拌摩擦焊仿真的特殊需求 - 关键方法:通过耦合约束实现局部坐标系随动 - 解决方案参考:《Abaqus有限元分析学习笔记(2)——耦合运动实现方法》[^3] - 典型应用场景:旋转机械、运动机构仿真 2. **装配体管理**(参考HyperMesh方法论的延伸应用) - 组件命名规范:建立`部件编号_材料类型`的命名体系 - 接触对分组管理:按接触类型创建专用显示组 - 推荐学习:B站视频BV1FRsteTED8(28分钟处开始装配管理演示)[^1] ### 三、学习资源导航 | 资源类型 | 内容特点 | 推荐链接/关键词 | |---------|---------|----------------| | 基础教学 | 界面操作+建模流程 | BV1Ed4y15721 | | 专题案例 | 复合运动实现 | 见引用[3]笔记 | | 工程应用 | 焊接仿真+数据提取 | 搅拌摩擦焊专题 | ### 四、学习建议 1. 采用`功能模块→典型案例→工程应用`三阶段学习法 2. 重点关注:约束定义、载荷步设置、结果提取三个核心技术模块 3. 实操时注意:版本差异可能导致界面选项位置变化(建议使用2022以上版本)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值