堆排序

简介: 堆排序过程是:先将所有的数组建成一个大根堆,然后将堆顶和堆的最后一个数交换,然后堆的大小减一,意味着堆不包括最后一个数。建立堆的过程其实是一个很简单的过程,就是将堆看成一个完全二叉树。
堆排序过程是:先将所有的数组建成一个大根堆,然后将堆顶和堆的最后一个数交换,然后堆的大小减一,意味着堆不包括最后一个数。建立堆的过程其实是一个很简单的过程,就是将堆看成一个完全二叉树。这个二叉树是逻辑上,并不存在,只是为了理解方便。实际上,堆是用数组实现的。

代码如下:

import java.util.Arrays;

public class Code_03_HeapSort {

    public static void heapSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            heapInsert(arr, i);
        }
        int size = arr.length;
        swap(arr, 0, --size);
        while (size > 0) {
            heapify(arr, 0, size);
            swap(arr, 0, --size);
        }
    }

    public static void heapInsert(int[] arr, int index) {
        while (arr[index] > arr[(index - 1) / 2]) {
            swap(arr, index, (index - 1) / 2);
            index = (index - 1) / 2;
        }
    }

    public static void heapify(int[] arr, int index, int size) {
        int left = index * 2 + 1;
        while (left < size) {
            int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;
            largest = arr[largest] > arr[index] ? largest : index;
            if (largest == index) {
                break;
            }
            swap(arr, largest, index);
            index = largest;
            left = index * 2 + 1;
        }
    }

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


    // for test
    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            heapSort(arr1);
            comparator(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                break;
            }
        }
        System.out.println(succeed ? "Nice!" : "Fucking fucked!");

        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr);
        heapSort(arr);
        printArray(arr);
    }

}


目录
相关文章
|
监控 物联网 视频直播
流量卡类型及其适用场景
不同流量卡的使用场景可以根据其特点、套餐内容、价格以及用户的具体需求来划分。以下是一些常见的流量卡类型及其适用场景:
|
Kubernetes 关系型数据库 MySQL
docker部署Discuz论坛
docker部署Discuz论坛
docker部署Discuz论坛
|
4月前
|
Web App开发 存储 缓存
markdown编辑器
本Markdown编辑器基于StackEdit改进,新增界面设计、代码高亮、图片拖拽、KaTeX公式、甘特图、多屏编辑、写作模式切换、检查列表等功能,提升写作体验,支持离线使用与多种格式导出。
256 0
markdown编辑器
|
5月前
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
571 20
|
10月前
|
JSON 前端开发 JavaScript
SpringBoot 2.0 多图片上传加回显
本文记录了在SpringBoot 2.0中实现商户注册后台功能时,处理多图片上传及回显的过程。通过使用`MultipartFile[]`接收前端传来的图片文件,并确保前后端参数名一致。展示了Controller、前端HTML和JS代码,以及配置文件中对上传图片大小的设置。还介绍了全局异常处理机制,使用`@ControllerAdvice`注解捕获异常。最后总结了一些常见问题及解决方法。
223 0
SpringBoot 2.0 多图片上传加回显
|
人工智能 自然语言处理
业界首家!阿里云智能媒体服务,卓越级通过中国信通院大模型媒体处理评估
阿里云智能媒体服务作为业界首家获得中国信通院“卓越级”通过。
386 5
业界首家!阿里云智能媒体服务,卓越级通过中国信通院大模型媒体处理评估
|
SQL 存储 安全
SQL Server用法
SQL Server用法
320 1
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
299 0
|
存储 传感器 监控
理解并利用物联网(IoT)数据的技术探索
【8月更文挑战第11天】物联网数据是数字化转型的重要资源。通过深入理解物联网数据的特性和价值,并采取有效的收集、处理和分析策略,我们可以更好地利用这些数据为企业决策提供支持、优化运营效率、创造新的商业模式并推动数字化转型的深入发展。
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
702 0