package junior.DAY_01;
public class Code_01_Sort
{
public static void main(String[] args)
{
//初始化数组
int len = (int)(Math.random()*20);//随机生成20以内的数组长度
int[] arr = new int[len];
for(int i = 0; i < len; i++)//在数组内随机生成1000内的值
{
arr[i] = (int)(Math.random()*1000) ;
}
for(int i = 0; i < len; i++)//格式化输出数组
System.out.printf("%02d:%-4d\n",i,arr[i]);
heapSort(arr);
for(int i = 0; i < len; i++)//格式化输出数组
System.out.printf("%02d:%-+4d\n",i,arr[i]);
}
public static void heapSort(int[] arr)
{//概念
//完全二叉树:满二叉树或者满二叉树的过程树
//用数组表示完全二叉树:
//索引i的左节点索引为:i*2+1 i*2+2 如果越界,则表示无该节点
//索引i的父节点索引为:(i-1)/2
//大根堆:整棵树的最大值就是根节点,每颗子树的最大值就是该子树的头结点
//将数组调成最大堆的方式:数组中的每个元素都与父节点比较,如果比父节点大,则和父节点交换位置,
//交换位置后还 应继续与父节点比较,直至小于父节点为止
//将最大堆调成有序:将根节点与最后一个节点交换,这样就把最大值换到了最后,并保持最大值的位置不变
//将堆的范围-1(不理会最大值)。
//然后将根节点与较大的左右孩子节点作比较,如果孩子节点比较大,则交换位置;
//交换位置后继续与孩子节点比较,直至比孩子节点大
//循环上面的步骤
if(arr == null || arr.length < 2)
return;
for(int i = 0; i < arr.length; i++)//将数组调成最大堆
heapInsert(arr,i);
int heapSize = arr.length;
int tmp = arr[0];//将最大堆的根节点和未排序堆的最后一个节点交换位置
arr[0] = arr[heapSize-1];
arr[heapSize-1] = tmp;
heapSize--;//将堆最后一个节点划入已排序部分
while(heapSize > 0)//只要未排序部分还有元素,则继续循环
{
heapify(arr,0,heapSize);//重新将未排序部分调整成最大堆
tmp = arr[0];//将最大堆的根节点和未排序堆的最后一个节点交换位置
arr[0] = arr[heapSize-1];
arr[heapSize-1] = tmp;
heapSize--;//将堆最后一个节点划入已排序部分
}
}
public static void heapInsert(int[] arr, int index)
{//将数组调成最大堆的方式:数组中的每个元素都与父节点比较,如果比父节点大,则和父节点交换位置,
//交换位置后还 应继续与父节点比较,直至小于父节点为止
//往上走
while(arr[index] > arr[(index-1)/2])
{
int tmp = arr[index];
arr[index] = arr[(index-1)/2];
arr[(index-1)/2] = tmp;
index = (index-1)/2;
}
}
public static void heapify(int[] arr, int index, int size)
{//将未排序部分调成最大堆 index表示开始调整位置 size表示堆的大小
//往下走
int left = index*2 + 1;
while(left < size)//保证左孩子节点不越界
{
int largest = 0;//
if(left+1 < size)//找出左右孩子节点比较大的节点
{
if(arr[left] > arr[left+1])
largest = left;
else
largest = left+1;
}
else
largest = left;
if(arr[largest] < arr[index])//把较大的孩子节点与父节点比较
{//如果没能比父节点大,则停止
largest = index;
break;
}
else//如果较大的孩子节点比父节点大,则与父节点交换位置
{
int tmp = arr[largest];
arr[largest] = arr[index];
arr[index] = tmp;
index = largest;//交换之后再接着与孩子节点比较
left = index*2+1;
}
}
}
}
相关推荐
Megatron单机多卡Qwen2.5:pre-train+sft
英伟达:https://github.com/NVIDIA/Megatron-LM/releases/tag/core_r0.8.0阿里:https://github.com/alibaba/Pai-Megatron-Patch/releases/tag/v0.10.2。
堆排序\链表实现局部排序
以前面试时被问一个问题:有10万个乱序的数,要前5个最大(或最小)的数?作为一个没好好学算法的人,还没有算法时间、空间复杂度的概念,只提出了冒泡、快速排序等,然后取前5。这显然不是合理的做法。 读了几本书,有一点点心得,下面介绍两个做法:假设:输入为[31,5,12,24,41,63,7,61,42,21,9,123,24...] ,总...
【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞
【代码】【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞。
几种排序总结(上)——堆排序
堆排序 这几天看了算法导论的排序部分,作一下总结。 堆排序的优点 1)最坏情况下o(nlgn)的时间复杂度 2)就地排序,不用辅助数组 几种操作(以最大堆为例) 1.保持堆性质 这是主要操作,对于节点A[i],前提是以LEFT(i)和RIGHT(i)为根的子树已经是一个排列好的堆,因此如果A[i]比他的子节点要小,对A[i]进行判断
STM32 超声波模块输入捕获测距(标准库)
通道2设置为下降沿触发,触发瞬间会将CNT的记录到CCR2中,由于上升沿触发时已经将CNT置零所以此时的CNT的值就是高电平的持续时间。通道1设置为上升沿触发,触发的瞬间会将CNT的值记录到CCR1里面,同时设置通道1触发带有从模式,并把从模式设置为置零CNT。超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。输入捕获原理可以看看这位大佬,感觉写的很清楚,工作电压与电流:5V,15mA。感测角度:不小于15度。
阿里云大模型ACP认证模拟考试(三)
【摘要】:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。
排序算法进阶(一)——快速排序算法(基本类型与复杂类型)
一个好的算法,不仅要高效的解决实际问题,还要以代码简介、冗余少为荣! 排序算法进阶(一)中介绍了快速排序算法,但它只是用与int类型的数组,当我们实际使用中往往会设计到多种数据类型,如浮点类型、字符串类型,难道需要再为这些类型重写一个除了类型以外其他都一样的方法吗? 不用,java的泛型类型给了我们这个便利。像我们平时经常用的List、Map、Vector,它的内部实现并不会都每一种数据类型进
Oracle数据库的内存管理优化技巧
Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。
常见排序算法
接下来一一介绍这些排序。
MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50)
本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。
基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示
基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示
【数据结构】排序算法——Lessen1
排序算法超超超详解
redhawk:STA timing data file解析
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?STA timing data file分为以下几个部分:• Header• Name Map• Footer这部分报告设计的基本信息,例如文件类型,设计名称,分隔符等。...
排序算法6——堆排序
堆排序简介 二叉堆简介 堆排序 总结堆排序简介堆排序可以看作是简单选择排序的一种的改进方法,平均复杂度为 \(O(n\log n)\),因此应用场合较多。其原理同简单选择排序相似:将数据分为已排序和未排序的两部分,并且不断的从未排序数据中选取最大(或最小)数据加入到已排序集合中。不同之处在于, 堆排序采用了一种特殊的二叉堆结构来快速的寻找最大值。(如下图,首先建立二叉堆,然后进行选择排序)二叉堆简介
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
[排序算法]4. 图解堆排序及其代码实现
堆是一种图的树形结构,被用于实现“优先队列”(priority queues)
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
堆排序 python_堆排序用python
Python天天美味(30) - python数据结构与算法之快速排序快速排序的原理是将取出第一个数,将整个数组分为两波,一拨都大于这个数,另一波都小于这个数,然后递归用同样的方法处理第一波数字和第二波数字。都说是“快速排序”,效率肯定比其他的一般排序算法高,下面我们就来验证一把,比较一下所谓的“快速排序”和“冒泡排序”的性能差异。1. 快速排序defqui...文章zting科技2017-01...
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
C++ 堆排序
基础: 1.完全二叉树:若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的结点数都达到最大个数,第h层所以的结点都连续集中在最左边,只能从最深处最右边从右往左缺省。 2.最大堆结构:是一个完全二叉树,堆中每个节点的值总是不大于其父亲节点的值(即根节点总是最大的元素) 思想: 1.将待排序数组形象成一个最大堆结构,从最后一个父节点(n/2-1)开始将其调整为最大堆 (父节点下标为i,则左孩子下标为2i+1,右孩子下标为2i+2) 2.将堆顶元素与待排序数组最后一个元素进行交换 3.待排
常见8大排序算法详解
冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序、基数排序(java版)
【数据结构基础整理】排序--03:堆排序
0x01.关于堆排序 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 0x02.堆的结构 ...
用 Python 实现十大经典排序算法
10种经典排序算法包括冒泡排序、选择排序、快速排序、归并排序、堆排序、插入排序、希尔排序、计数排序、桶排序、基数排序等。 当然,还有一些其他的排序算法,大家可以继续去研究下。 01冒泡排序 冒泡排序(Bubble Sort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。 注:上图中,数字表示的是数据序列原始的索引号。 算法过程 比较相邻的元素,如果前一个比后一个大,就把它们两个对调位置。 ..
经典排序算法 下篇【快速,堆排序,计数,桶,基数】
经典排序算法 下篇 目录经典排序算法 下篇一,准备工作二,快速排序三,堆排序四,计数排序五,桶排序六,基数排序七,总结 一,准备工作 //获取随机的数组 func GetArry(count int) []int { arr := make([]int, count) rand.Seed(time.Now().UnixNano()) for i := 0; i < count; i++ { arr[i] = rand.Intn(100) } return arr } //打印数组
python数据结构——堆排序
堆排序哦!!大家快来学,面试寄题!!!
算法分析与设计 八大排序算法
八大排序算法八大排序分类01 冒泡排序02 直接插入排序03 简单选择排序04 希尔排序05 快速排序06 堆排序07 归并排序08 桶排序/基数排序参考资料 八大排序分类 笔者是在LeetCode刷题过程中来复习排序算法的,虽然在刷题中我们可以使用高级编程语言提供封装好的排序算法便捷实现排序任务,例如 C++ 里可以通过 STL 中基于快速排序实现的 std::sort() 算法便捷实现排序任务。而且刷题时除非题目考点就是排序算法,否则也不建议自己手写排序算法。 但是知识都是有着累积发展的过程,我
python 堆排序_堆排序用python
Python天天美味(30) - python数据结构与算法之快速排序快速排序的原理是将取出第一个数,将整个数组分为两波,一拨都大于这个数,另一波都小于这个数,然后递归用同样的方法处理第一波数字和第二波数字。都说是“快速排序”,效率肯定比其他的一般排序算法高,下面我们就来验证一把,比较一下所谓的“快速排序”和“冒泡排序”的性能差异。1. 快速排序defqui...文章zting科技2017-01...
堆的创建、插入、删除以及堆排序算法总结
在说堆的概念之前先说一下关于树和二叉树的一点儿知识~~ 1. 树 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,叶子朝下的。 1.1 树的特点: 每个节点有零或多个子节点 没有父节点的节点称为根节点 每个非根节点有且仅有一个父节点 除了根节点外,每个子节点可以分成多个不相交的子树 1.2 树...
常见排序算法总结及C语言实现
一直没有好好的扎扎实实的算法的基础,要找工作了,临时抱下佛脚,顺便把学的东西整理下,以应对比较健忘的大脑。。。 废话不说,直接主题,其实整理这个,借鉴了不少这个blog,http://www.cppblog.com/shongbee2/archive/2009/04/25/81058.html 在此再次感谢这个博主,但愿有一天,自己也能请博主喝杯咖啡 哈哈~ 先从最熟悉的冒泡排序开始吧:
2178



被折叠的 条评论
为什么被折叠?



