package com.rao.linkList;

import java.util.Arrays;

/**
* @author Srao
* @className HeapSort
* @date 2019/12/3 15:29
* @package com.rao.linkList
* @Description: 堆排序
*/
public class HeapSort { /**
* 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
* @param arr
* @param parent:被当作根元素的节点,从这个元素开始下沉
* @param length:数组的长度
* @return
*/
public static int[] downAdjust(int[] arr, int parent, int length){
//获取临时的根节点
int temp = arr[parent]; //计算左孩子节点
int child = parent*2+1; //进行下沉操作
while (child < length){
//先对比左右孩子的大小,用小的那一个进行操作
if (child+1 < length && arr[child+1] < arr[child]){
child++;
}
//如果父节点比子节点小,就直接退出
if (temp <= arr[child]){
break;
}else {//如果父节点比子节点大,就把子节点赋值给父节点
arr[parent] = arr[child];
//让父节点指针指向子节点
parent = child;
child = parent*2+1;
}
}
arr[parent] = temp;
return arr;
} /**
* 进行堆排序,因为二叉堆的顶部的数一定是最小的,
* 所以把堆顶元素和堆的最后一个元素交换,然后重新构成一个二叉堆,
* 每次都把最小的元素放在堆的最后
* @param arr
* @return
*/
public static int[] sort(int[] arr, int length){
//先构建一个二叉堆
for (int i = (length-1)/2; i>=0; i--){
downAdjust(arr, i, length);
} //进行排序
for (int i = length-1; i > 0; i--){
//先把最小的元素放在堆的最后面,然后对堆的其它元素进行下沉
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp; downAdjust(arr, 0, i);
} return arr;
} public static void main(String[] args) {
int[] arr = new int[]{1, 3, 2, 6, 5, 0};
System.out.println(Arrays.toString(arr));
sort(arr, arr.length);
System.out.println(Arrays.toString(arr));
}
}

参照上一篇博客,里面又二叉堆构建的代码  https://www.cnblogs.com/rao11/p/11976960.html

因为二叉堆的结构是堆顶元素最小,所以每次让堆顶元素和堆底元素进行交换,然后对除了最后一个元素以外的元素进行下沉操作,获得一个新的二叉堆

每次进行下沉操作,数组中最小的元素都是堆顶元素,然后又与堆底元素进行交换,直到二叉堆只剩下一个元素,排序完成。

排序算法-堆排序(Java)的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  3. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  4. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  5. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  6. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  7. 几大排序算法的Java实现(原创)

    几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...

  8. 使用 js 实现十大排序算法: 堆排序

    使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...

  9. 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)

    排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...

  10. 排序算法(JAVA)

    import java.util.Random;      /**  * 排序测试类  *   * 排序算法的分类如下:  * 1.插入排序(直接插入排序.折半插入排序.希尔排序):  * 2.交换排 ...

随机推荐

  1. python之路——阅读目录

    阅读目录 希望大家多多交流,有错误的地方请随时指正,笔记记得可能有点杂 一.python入门 计算机基础 编程语言发展史和python安装  二.数据类型.字符编码.文件处理 python基础数据类型 ...

  2. C语言输入单字符避免回车的四种方法

    在scanf()中使用'\n'屏蔽回车符号. scanf("%d\n", &n); scanf("%c", &c); 2.在scanf()格式串 ...

  3. NVDLA软件架构和源码解析 第一章—内核驱动【华为云技术分享】

    驱动整体设计介绍 不同的processor Nvidia DLA的内核驱动KMD(Kernel mode driver)中,并不是把DLA当成一个设备来控制,而是把不同的功能模块当做不同的proces ...

  4. switch/case/default中的雷区

    switch的语法如下: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case常量表达式n: 语句n;break; def ...

  5. Prometheus监控学习笔记之Grafana用户权限分组

    Grafana有账户分权和管理功能,不过和一般的账户分权管理操作不一样.Grafana通过admin账户建立organization,在不通的org内配置数据源和用户,用户隶属于不通的org,只能看到 ...

  6. IdentityServer4学习及简单使用

    本文,主要用来记录IdentityServer4的简单使用. 一. IdentityServer的预备知识 要学习IdentityServer,需要了解下基于Token的验证体系,其中涉及到Token ...

  7. 通过调试vue-cli 构建代码学习vue项目构建运行过程

    我们知道vue-cli 3.0之前直接基于webpack创建对应配置文件,我们通过学习webpack就能够了解其构建过程,然而从vue-cli 3.0开始,vue-cli命令行更改为@vue/cli以 ...

  8. Java之路---Day19(set接口)

    set接口 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方 法基本一致,但是set接口中元素 ...

  9. Vue学习之Webpack小结(十二)

    一.nrm: nrm是专门用来管理和快速切换私人配置的registry; nrm提供了一些最常用的npm包镜像地址,能够让我们快速的切换安装包时候的服务器地址: 二.镜像: 原来   包    刚一开 ...

  10. 33、vue中的事件修饰符.stop、.prevent、.self、.capture、.once

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...