JAVA数据结构(十一)—— 堆及堆排序
堆
堆基本介绍
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,最坏,最好,平均时间复杂度都是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数据结构(十一)—— 堆及堆排序的更多相关文章
- Java数据结构之堆和优先队列
概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...
- java数据结构之(堆)栈
(堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
- java数据结构和算法10(堆)
这篇我们说说堆这种数据结构,其实到这里就暂时把java的数据结构告一段落,感觉说的也差不多了,各种常见的数据结构都说到了,其实还有一种数据结构是“图”,然而暂时对图没啥兴趣,等有兴趣的再说:还有排序算 ...
- java数据结构----堆
1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- Java数据结构和算法(五)二叉排序树(BST)
Java数据结构和算法(五)二叉排序树(BST) 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉排序树(Binary S ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- Java数据结构和算法(三)顺序存储的树结构
Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
随机推荐
- Django的下载及命令
安装 命令行 pip3 install django==1.11.11 测试是否安装成功 django-admin 创建django项目 django-admin startproject 项目名称( ...
- charles功能(五)屏蔽web网页的抓包信息(proxy)
应用场景:屏蔽web网页的抓包信息 proxy-->windows proxy(前面没有对勾,就不会抓到 PC浏览器的包) proxy-->macOS proxy(mac电脑) 最终效果
- 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反
一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...
- 第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用
一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>介绍了组匹配模式,在一个正则表达式内可以定义多个组,每个组都有一个顺 ...
- PyQt(Python+Qt)学习随笔:QListView的gridSize属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的gridSize属性用于控制视图中数据项排列所在网格的大小,gridSize默认 ...
- 深入理解C#中的异步(一)——APM模式EAP模式
深入理解C#中的异步(一)--APM模式EAP模式 目录 深入理解C#中的异步(一)--APM模式EAP模式 1 使用异步编程的原因 2 异步编程模式 2.1 APM模式 2.1.1 APM模式示例代 ...
- 图 Graph
本文主要内容为:图的定义以及基本术语 图的定义 图 图G的组成:由 数据元素的集合E 和 数据间的关系集合E 组成,记作:G = <V, E> 顶点 (vertex):数据元素,V就是顶点 ...
- 从 0 开始的min_max容斥证明
二项式反演 \[f_n=\sum\limits_{i=0}^nC^i_ng_i \Leftrightarrow g_n=\sum\limits_{i=0}^n{(-1)}^{n-i}f_i \] 证明 ...
- 深入理解Java虚拟机(九)——后端编译与优化
即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...
- Linux文件被删除后恢复
当ext4中的文件被删除后,进行文件恢复:http://www.360doc.com/content/18/0320/08/51898798_738625260.shtml上面的博客是恢复删除的文件, ...