当前位置: 首页 > article >正文

堆排序

目录

堆排序(不稳定):

    代码实现:

    思路分析:

     总结:


堆排序(不稳定):

   如果想要一段数据从小到大进行排序,则要先建立大根堆,因为这样每次堆顶上都能取到数据中最大的,可以交换到一段数据最后面。

    代码实现:

public static void heapSort(int[] arr) {
        createHeap(arr);
        int end = arr.length - 1;
        while(end > 0) {
            swap(arr,0,end);
            siftDown(arr,0,end);
            end--;
        }
    }

    //建立大根堆
    public static void createHeap(int[] arr) {
        for (int i = (arr.length-1-1) / 2; i >= 0 ; i--) {
            siftDown(arr,i, arr.length);
        }
    }

    //向下调整
    private static void siftDown(int[] arr,int parent, int k) {
        int child = 2 * parent + 1;
        while(child < k) {
            if(child + 1 < k && arr[child + 1] > arr[child]) {
                child++;
            }
            if(arr[child] > arr[parent]) {
                //交换
                swap(arr,parent,child);
                parent = child;
                child = 2 * parent + 1;
            }else {
                break;
            }
        }
    }

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

    思路分析:

        

       红色代表数组下标。

        首先,想要从小到大排序,在堆排序开始之前,先对数据建立一个大根堆,之后,交换0下标和数据末尾的值,这样最后一个下标的值得到的是该段数据中最大的值了,再从0下标位置开始向下调整这个堆,以此往复,当 end 为 0 时停止。此时从上往下,从左往右得到的就是升序的数据了。

        

     总结:

        排升序要建大堆,排降序建小堆。

        


http://www.kler.cn/a/542620.html

相关文章:

  • 【SVN基础】
  • 计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)
  • STM32F103C8----外部中断探秘:解锁嵌入式实时响应的关键
  • 示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)
  • 【Unity】性能优化:UI的合批 图集和优化
  • 数据仓库和商务智能:洞察数据,驱动决策
  • MySQL InnoDB引擎 MVCC
  • C++————广度优先搜索(基础)
  • DeepSeek入门到精通!(清华大学104页ppt下载)
  • Tauri Windows入门开发避坑指南
  • Git 钩子的应用与自动化流程
  • 制药行业 BI 可视化数据分析方案
  • Qt QOpenGLWidget详解
  • docker 安装--离线
  • SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统
  • 停止回答 definecomponent is not defined
  • 基于脚本的modelsim自动化仿真笔记
  • 算法随笔_44: 最大矩形
  • AI时代下的安全堡垒:零信任模式如何守护你的AI系统
  • elementUI表单校验失败自动聚焦到失败input/select等输入框
  • 云计算如何推动数字化转型?
  • HTTP请求响应分析:HTTP/1.1→HTTP/2
  • 分布式通信处理层中kafka和Redis的作用
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题
  • VPN服务器是怎么把数据转发到外网的?
  • 二、k8s项目的生命周期