堆基本介绍

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,最坏,最好,平均时间复杂度都是O(nlogn),不稳定的排序

堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值称为大顶堆

小于或等于左右孩子节点的值称为小顶堆

堆排序

基本思想

将待排序的序列构造成一个大顶堆(数组)

此时 ,整个序列的最大值就是堆顶的根节点

将其与末尾元素进行交换,此时末尾为最大值

然后将剩余n-1个元素重新构造成一个堆,这样就会得到n个元素的次小值。如此反复执行便能得到一个有序序列

基本步骤

构造初始堆,顺序存放

从最后一个非叶子节点:arr.length/2-1,开始,从左至右,从下至上进行调整

找到第二个非叶子节点,比较其与子节点的大小进行交换

这会导致其交换子树的顺序混乱则继续向下交换

堆顶出堆,针对剩余元素重复上列步骤

代码实现

package com.why.tree;



import java.util.Arrays;

import java.util.jar.JarEntry;



/**

  • @Description TODO 堆排序
  • @Author why
  • @Date 2020/11/26 18:05
  • Version 1.0

    /

    public class HeapSort {

    public static void main(String[] args) {

    int[] arr = {4,6,8,5,9};

    heapSort(arr);

    }



    /

    • 堆排序
    • @param arr

      /

      public static void heapSort(int[] arr){

      int temp = 0;

      //调整成大顶堆

      for (int i = arr.length/2 - 1; i >= 0 ; i--) {

      adjustHeap(arr,i,arr.length);

      }

      //将堆顶元素与末尾元素交换,将最大元素沉到数组末端

      for (int i = arr.length - 1; i > 0; i--) {

      //交换

      temp = arr[i];

      arr[i] = arr[0];

      arr[0] = temp;

      adjustHeap(arr,0, i);

      }

      System.out.println(Arrays.toString(arr));

      }



      /
      *
    • 将数组(二叉树)调整为大顶堆
    • 完成将i对应的的非叶子节点调整成大顶堆
    • 自下向上调整
    • @param arr 待调整的数组
    • @param i 表示非叶子节点在数组中的索引
    • @param lengt 表示对多少个元素进行调整,lengt逐渐减小

      */

      public static void adjustHeap(int[] arr,int i,int lengt){

      //取出当前的值,保存至临时变量

      int temp = arr[i];

      //开始调整

      //j = i * 2 + 1,j是i节点的左子节点

      for (int j = i * 2 + 1; j < lengt; j = j * 2 + 1) {

      if(j + 1< lengt &&arr[j] < arr[j+1]){//左子节点小于右子节点

      j++;//j指向右子节点

      }

      if (arr[j] > temp){//如果子节点大于父节点

      arr[i] = arr[j];//把子节点较大的值与父节点交换

      i = j;//i指向j继续循环比较

      }else {

      break;

      }

      }

      //for循环结束后已将以i为父节点的的树的的最大值放到了堆顶(局部)

      arr[i] = temp;//将temp赋值放到最后的位置

      }

      }

JAVA数据结构(十一)—— 堆及堆排序的更多相关文章

  1. Java数据结构之堆和优先队列

    概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...

  2. java数据结构之(堆)栈

    (堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...

  3. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  4. java数据结构和算法10(堆)

    这篇我们说说堆这种数据结构,其实到这里就暂时把java的数据结构告一段落,感觉说的也差不多了,各种常见的数据结构都说到了,其实还有一种数据结构是“图”,然而暂时对图没啥兴趣,等有兴趣的再说:还有排序算 ...

  5. java数据结构----堆

    1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...

  6. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  7. Java数据结构和算法(五)二叉排序树(BST)

    Java数据结构和算法(五)二叉排序树(BST) 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉排序树(Binary S ...

  8. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  9. Java数据结构和算法(三)顺序存储的树结构

    Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...

  10. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

随机推荐

  1. 分布式系统唯一ID

    一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...

  2. SQL优化之SELECT COUNT(*)

    前言 SQL优化之SQL 进阶技巧(上) SQL优化之SQL 进阶技巧(下)中提到使用以下 sql 会导致慢查询 SELECT COUNT(*) FROM SomeTable SELECT COUNT ...

  3. 从七牛云迁移图片到github

    迁移理由 问题是网站的大部分图床都是用的七牛云,官网有改动,所以原测试域名都失效,所以决定进行迁移,将七牛云中的图片迁移到github仓库中. 迁移步骤 Step1:从废弃测试域名空间至可用测试域名空 ...

  4. SLR(1)语法分析(JAVA实现)

    要求 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util. ...

  5. OA公文流转系统(未完成)

    基本页面比较多,所以就不贴出来了,具体的页面可以自行浏览. 点我进入OA系统浏览界面(未做响应式布局,需电脑端打开) 账号密码: 部门:bumen------bumen 办公室:bangongshi- ...

  6. (四)一个bug的生命周期

    Bug的属性 Bug重现环境 这个应该是我们重现BUG的一个前提,如果没有这个前提,我们可能会无法重现问题,或者根本就无从下手. • 操作系统 这个是一般软件运行的一大前提,基本上所有的软件都依赖于操 ...

  7. Hive数据导入HBase引起数据膨胀引发的思考

    最近朋友公司在做一些数据的迁移,主要是将一些Hive处理之后的热数据导入到HBase中,但是遇到了一个很奇怪的问题:同样的数据到了HBase中,所占空间竟增长了好几倍!详谈中,笔者建议朋友至少从几点原 ...

  8. 小心使用 Task.Run 续篇

    关于前两天发布的文章:为什么要小心使用 Task.Run,对文中演示的示例到底会不会导致内存泄露,给很多人带来了疑惑.这点我必须向大家道歉,是我对导致内存泄漏的原因没描述和解释清楚,也没用实际的示例证 ...

  9. 为什么要有 Servlet ,什么是 Servlet 容器,什么是 Web 容器?

    本文已收录至 https://github.com/yessimida/yes ,这里有我的所有文章分类汇总,欢迎 star! 以下代码相信大家都很熟悉,大学时学 Java Web 都写过这样的代码. ...

  10. NOI 2020 D1T3 本人题解

    我看了出题人本题的做法,感觉很难写,就自己胡了一个\(O((n + m) \sqrt n)\)的做法. 第一步我的想法与出题人一样,都是考虑容斥降维.对第\(i\)组询问,我们枚举两个事件中较大的一个 ...