大顶堆小顶堆java_《排序算法》——堆排序(大顶堆,小顶堆,Java)
十大算法之堆排序:堆的定义例如以下:
n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。
" ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"
若将和此次序列相应的一维数组(即以一维数组作此序列的存储结构)看成是一个全然二叉树,
则全然二叉树中每个节点的值的都大于或等于随意一个字节的值(假设有的话)。称之为大顶堆。
则全然二叉树中每个节点的值的都小于或等于随意一个字节的值(假设有的话),称之为小顶堆。
由此,若序列{k0,k1,…,k(n-1)}是堆。则堆顶元素(或全然二叉树的根)必为序列中n个元素的最小值(或最大值)。
倘若给堆中每个节点都赋予一个整数值标签,根节点被标记为0。对于每个标记为i的节点,其左子节点(若存在的话)被标记为2*i+1,其右子节点(若存在的话)被标记为2*i+2,对于一个标记为i的非根节点,其父节点被标记为(i-1)/2。使用这个标记,我们可以将堆存储在数组中。节点存储在数据中的位置就使其标签。
package sort;
import java.util.Arrays;
/*
* 堆排序
* 堆的定义:满足 Ki <= K2i+1 Ki<=K2i+2 为小顶堆,满足 Ki >= K2i+1 Ki>=K2i+2 为大顶堆
* 此为大顶堆的代码实例,小顶堆相似
*/
public class duiSort {
static int[] arr = {
16,7,3,20,17,8 //定义待排序数组
};
public static void main(String[] args) {
buildHeap();//建立大顶堆并排序
System.out.println("排序好的为:" + Arrays.toString(arr));
}
private static void buildHeap() {
// TODO Auto-generated method stub
int len = arr.length;
for(int i =len/2 -1 ;i>=0;i--) //建立大顶堆
{
sortHeap(i,len);
}
System.out.println("建立好的大顶堆例如以下:" + Arrays.toString(arr));
for(int j = len-1; j >0; j --) //对大顶堆进行排序
{
swap(0,j);
sortHeap(0,j);
}
}
private static void sortHeap(int i, int len) {
// TODO Auto-generated method stub
int left = 2*i+1; //定义左节点
int right = 2*i +2; //定义右节点
int large = 0; //存放三个节点中最大节点的下标
if(len >left && arr[left] > arr[i]) //假设左孩子大于根节点 将左孩子下标赋值给large
large = left;
else //否之。将根节点下标赋值给large
large = i;
if(len > right && arr[right] > arr[large])
large = right; //若右孩子节点大于根节点,把右孩子节点下标赋值给large
if(large != i) //若最大节点的下标不等于根节点的下标时,交换其值
{
swap(large,i);
sortHeap(large,len);
}
}
//交换相应下标值
private static void swap(int m, int n) {
// TODO Auto-generated method stub
int temp ;
temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
}
大顶堆小顶堆java_《排序算法》——堆排序(大顶堆,小顶堆,Java)相关推荐
- 小白带你学---排序算法1
微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言; 小白算法,简单白话算法,每个人都能看懂的算法 序言 排序,顾名思义就是排列使得有序呗!!!通常意义上,我们所说的 ...
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
- c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)
原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...
- 排序算法——十大排序算法的图示与实现
十大排序算法概览 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于 ...
- 十大经典排序算法----堆排序(超详细)
目录 1. 堆排序的基础知识 1.1 大顶堆&&小顶堆 1.2 向下调整算法 1.3 物理结构与逻辑结构的关系 2. 堆排序详解 2.1 堆排序整体思路 2.2 思路详解 2.2.1 ...
- 排序算法——十大排序算法总结与对比
一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...
- 插入排序算法 java_排序算法实现-插入排序(Java版本)
原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...
- 插入排序java_排序算法之直接插入排序Java实现
排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 选择排序 冒泡 java_排序扯淡:冒泡、选择、插入(Java)
算法的本质 最近一直在想,算法的本质到底是什么,为什么有时云里雾里,有时却了然可见,深深思考了下,算法本质就是一个解决问题的思想,计算机的世界里需要的就是抽象的思想,有了抽象思想,你就有了高度,原谅我 ...
- 折半插入排序c语言 csdn,排序算法实大.doc
排序算法实现大全 后面的例程,都是对数组的排序,使用静态链表的也适用于链表的排序.为简单起见,只对单关键码排序,并且最后的结果都是从头到尾按升序排列.下面是统一的测试程序:#include #incl ...
最新文章
- spring in action 4 第5章
- Windows 技术篇-设置dns提升网速,刷新dns缓存
- 产品经理必备知识之网页设计系列(三)-移动端适配无障碍设计及测试
- 全球及中国新鲜芒果制品市场投资份额与营销渠道分析报告2022版
- php_flag .htaccess,Apache服务器中.htaccess文件的实用配置示例集锦
- wait 和 sleep 区别
- 计算机视觉CV中RANSAC算法的学习笔记~
- 图像局部特征(十二)--BRISK特征
- 138. PHPExcel 操作
- linux温度监控软件,PSensor:Linux下硬件温度监控软件
- 阿里巴巴第三财季营收1172.78亿元,同比增41%
- 黑客黑手伸向微博微信手机成网络钓鱼主要渠道
- python写采集程序_python实现简易采集爬虫
- 【HISI系列】海思 IPC hi3516a、hi3519v101 的单包模式和多包模式
- 2023最新软件工程毕业设计题目汇总
- 现代 Web 开发的现状与未来(JSDC 2019 演讲全文)
- swift新手进阶30天一 自定义上图片下文字的UIButton的几种方式
- python网页爬虫漫画案例_Python爬虫 JS案例分析:爬取鬼灭之刃漫
- 健康管理系统开发笔记
- NEWS|药物发现公司正在定制ChatGPT:方法如下