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做一个计时器的动画

    一.问题在做连连看的时候需要加一个计时器的动画,这样就完成了计时功能的设计. 二.解决主要思路: 1.先产生一个画布,用深颜色填充满. 2.产生一个新的矩阵用来覆盖画布,背景用白色,就可以渲染出来递减 ...

  2. SQL系列(一)—— SQL简介

    在说到SQL之前需要了解一些关于数据库的概念: 数据库(database):是一个以某种有组织的方式存储的数据集合.存储数据的仓库,不过是以一定的组织方式进行存储. DBMS:数据库管理系统.经常遇到 ...

  3. 【LeetCode】633. Sum of Square Numbers

    Difficulty: Easy  More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/sum-of-square-n ...

  4. ML学习笔记之TF-IDF原理及使用

    0x00 什么是TF-IDF TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率). # 是一种用于资讯检索与资讯探勘的常用加权技术. ...

  5. Scrapy框架中的xpath选择

    不同于我们普通爬虫获取xpath,scrapy获得xpath对象获取他的值语法 一.xpath对象获取值 xpath对象..extract() 二.Scrapy框架独有的xpath取值方式 利用hre ...

  6. java8使用stream的collect进行list转map注意事项

    1.创建Person类 package com.xkzhangsan.normal.collectors; public class Person { private Integer id; priv ...

  7. python爬虫---爬虫的数据解析的流程和解析数据的几种方式

    python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...

  8. 31、splice()用法

    改变数组,向数组中添加/删除元素: eg: 1.删除元素: let arr=['bob','lily','bike','sam']; arr.splice(2,1) console.log(arr) ...

  9. BeanPostProcessor后置处理器原理以及ApplicationListener原理

    BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 1.BeanFactoryPostProcessor:BeanFactory的后置处理器; 在Bean ...

  10. java集合学习(2):Map和HashMap

    Map接口 java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map. Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含 ...