Java常见排序算法之堆排序

在学习算法的过程中,我们难免会接触很多和排序相关的算法。总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的。

从今天开始,我们将要进行基本的排序算法的讲解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的讲解

     时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。

     空间复杂度:分析需要多少辅助的内存。

     稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们的位置没有发生交换,那么我们称这个排序算法是稳定的。

              否则我们称这个排序算法是不稳定的。

   

    排序算法的常见分类:

    1、内部排序(最常见的一种排序方式,不需要借助第三方辅助存储工具)

    2、外部排序(需要借助外部存储来辅助完成相关的排序操作)

        如果参与排序的数据元素非常的多,数据量非常的大,计算机无法把整个排序过程放到内存中进行的话,

        我们必须借助外部存储器如磁盘来完成,这种排序方式,我们称之为外部排序。

        其中外部排序最常见的就是多路归并排序,即将原始文件分解成多个能够一次性装入内存的部分,分别把每一部分调入

        内存完成相应的排序,接下来在对多个有序的外部文件进行多路归并排序。

  

   对于我们绝大多数的程序员而言,我们经常遇到的为内部排序。接下来我们将要对常见的内部排序进行相应的讲解。

    今天要讲解的内部排序为:

    堆排序

  1、堆排序的基本概念的讲解

     堆排序是一个树形选择排序方法,它的特点是:在排序过程中,将L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树

    中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。

   堆的定义如下:n个关键字序列L[1...n]称为堆,当且仅当该序列满足:

   ①L(i)<=L(2i)且L(i)<=L(2i+1)

   ②L(i)>L(2i)且L(i)>=L(2i+1)(1<=i<=[n/2])

   满足第一种情况的堆称为小根堆(小顶堆),

   满足第二种情况的堆称为大根堆(大顶堆)。

   算法思想:对于构造初始堆,就是一个反复筛选的过程。

   n个结点的完全二叉树,最后一个结点是第【n/2】个结点为根的孩子。

   对第【n/2】个结点为根的子树筛选,使该子树成为堆。

   之后向前依次对各结点(【n/2】-1~1)为根的子树进行筛选,看该结点值是否大于其左右结点的值,

   若不是,将左右结点中较大值与之交换,交换后可能会破坏下一级的堆,于是继续采用上述方法构造

   下一级的堆,直到以该结点的子树构造成堆为止。

   反复利用上述调整堆的方法建堆,直到根节点为止。

  2、堆排序之Java代码实现

 

package com.yonyou.test;/*** 内部排序算法之堆排序* 默认按照从小到大进行排序操作* @author 小浩* @创建日期 2015-3-24*/
public class Test{public static void main(String[] args) {//需要进行排序的数组int[] array=new int[]{8,3,2,1,7,4,6,5};//输出原数组的内容printResult(array);//进行堆排序操作for(int i=array.length-1;i>0;i--){//进行n-1次建大顶堆,每次建堆,都把最小的值放到根位置上面//同时在每次建堆的过程中选出最大的值作为根//创建大顶堆的过程也是创建完全二叉树的过程buildMaxHeap(array,i);}//输出排序后的相关结果printResult(array);}/*** 建立大顶堆的过程* @param array* @param i*/private static void buildMaxHeap(int[] array, int i) {//从叶子节点的第一个父节点开始循环for(int j=(i-1)/2;j>=0;j--){   //最后一个节点并且这棵树只有左子树if((2*j+1==i)&&(i%2!=0)){if(array[j]<array[2*j+1])swap(array,j,2*j+1);}else{if(array[j]<array[2*j+1])swap(array,j,2*j+1);if(array[j]<array[2*j+2])swap(array,j,2*j+2);}}swap(array,0,i);}/*** 输出相应数组的结果* @param array*/private static void printResult(int[] array) {for(int value:array)		System.out.print(" "+value+" ");System.out.println();}/*** 交换数组中两个变量的值* @param array* @param i* @param j*/private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;}
}

  3.堆排序的效率分析

    时间复杂度:假设有n个数据,数据交换的次数最多为n-1次,但程序的总体的比较次数较多。所以综合考虑有直接选择排序的时间复杂度为O(n2)

   (n的平方)。所以当记录占用字节数较多时,通常比直接插入排序的执行速度快些。

    空间复杂度:直接选择排序的空间复杂度很好,它只需要一个附加单元用于数据交换,所以其空间复杂度为O(1)。

    稳定性:由于在直接选择排序中存在着不相邻元素之间的互换,因此,直接选择排序是一种不稳定的排序方法。

 

   好吧,直接选择排序的讲解就先到这里了。

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python量化数据处理小细节2

处理数据主要使用的是DataFrame格式&#xff0c;偶尔也会有list格式。 首先定位寻找数据&#xff1a;主要为loc&#xff0c;iloc 创建DataFrame&#xff1a; df pd.DataFrame([1,2,3,4,5],index [a,b,c,d,e],columns[aa])或 datapd.DataFrame(np.arange(16).reshape(4,4),i…

python编码问题

参考&#xff1a;https://blog.csdn.net/qq_33692803/article/details/81321340 注意区分系统默认编码和本地默认编码、编码和解码的区别转载于:https://www.cnblogs.com/jianglinliu/p/10418437.html

软件工程师所需掌握的“终极技术”是什么?

最近&#xff0c;我在微博上看到程序员邹欣老师发的一条微博 — “不少大学同学都有一个想法&#xff1a;先做几年技术&#xff0c;然后做管理&#xff1b;也有一些同学说&#xff1a;我技术不行&#xff0c;希望直接找到一个管理的工作&#xff0c;就像PM那样。请看 PM 需要什…

linux中项目部署和日志查看

1 查找进程 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ps -ef | grep java 查看所有关于java的进程 root 17540 1 0 2009 ? 01:42:27 /usr/java/jdk1.5.0_1…

dspmq dspmqver command not found(dspmq命令找不到,dspmqver主安装目录设置不正确

[rootrhv6-64b ~]# su - mqm -bash-4.1$ dspmq -bash: dspmq: command not found&#xff08;dspmq命令找不到&#xff09; -bash-4.1$ dspmqver&#xff08;dspmqver主安装目录设置不正确&#xff09; AMQ8594: WebSphere MQ commands are no longer available in /usr/bin. I…

lambda表达式与委托与线程初步谈论-基于刘铁锰视频观后操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//线程 using System.Threading;//引用线程方法namespace ConsoleApplication2 {class Program{static void Main(string[] args){//委托详解//Func返回…

2020-11-21

获取数据后&#xff0c;需要对数据进行合并&#xff0c;通常是日期&#xff0c;也有对相同公司进行合并 下面就研究数据合并的常用方法&#xff1a; 目录appendmergeon属性how属性&#xff08;inner&#xff0c;outer&#xff0c;left &#xff0c; right&#xff09;indicato…

走技术线,还是技术管理线?

最近因为要给刚毕业的学生做一次演讲&#xff0c;所以就职业发展这类话题先以写博客的形式做一些思考&#xff0c;希望届时能给同学们带来质量更高的内容。我在《驾驭你的“职场布朗运动”》一文中谈了25条职场感悟并提出了“走技术线&#xff0c;还是技术管理线&#xff1f;”…

[Nikon D80]樱花盛开的校园

花开花落&#xff0c;阳春三月&#xff0c;随身背着相机在学校里游走&#xff0c;不断的寻找视角。知道自己拍的不好&#xff0c;总觉得自己拍的片有各式各样的缺陷&#xff0c;也许这就是大师与学徒的区别吧。用好手头的装备&#xff0c;出好片&#xff0c;锻炼Visual Effect …

「LG2664 树上游戏」

题目 这真是一道神仙的一批的题目 定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量 设 \[sum_i\sum_{j1}^ns(i,j)\] 求出所有的\(sum_i\) 考虑点分治 对于一个点我们用两种方式来统计其答案 这个点作为分治重心时&#xff0c;分值区域内所有点到这个点贡献这个点不是分治重…

DUBBO 使用问题记录

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 官方ISSUE参考 https://github.com/alibaba/dubbo/issues 注册中心ZookeeperRegistry.doSaveProperties warn 2014-10-1419:56:51WARN …

真格量化学习处理——几个功能小函数

真格这周是学习使用了不少,功能算是很不错,但在做的时候也发现了一个问题: 数据缺失:我在做回测,要求获取每天的delta值,并从中筛选条件值时,报错,显示无数据。不得不使用pass,影响我的回测连贯性。 现在开始讲下,我做的几个功能函数: 算起来,挺烦的,就是各种细节…

软件技术发展的驱动力

软件产品的终极目标是为了实现用户需求从而满足人们的需要。也正是为了不断满足人们的需要使得软件行业不断向前发展。比如&#xff0c;新的算法&#xff08;MPEG-1、MPEG-2、MPEG-4、H.264、……&#xff09;等的出现都在当时为了满足不同的需要而被发明。然而&#xff0c;人们…

The Model Driven Software Network

国外的一个模型驱动软件开发的讨论社区&#xff0c;The Model Driven Software Network这个社区讨论的都是模型驱动开发相关的话题&#xff0c;虽然建立不久&#xff0c;但加入的人越来越多&#xff0c;建立群组的是Mark Dalgarno以下是一些讨论: Textual v Graphical models W…

无敌简单快速的文件服务器sgfs

前言 想要构建一个Linux文件服务器&#xff1f;看看下面几个要求是不是你想要的&#xff1f; 1、只需要单节点部署就够了 2、部署启动简单&#xff0c;下载之后&#xff0c;一键启动&#xff0c;一键关闭 3、不需要任何其他的依赖安装&#xff0c;而且运行时占用内存资源少 4、…

springboot多数据源配置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 之前在介绍使用JdbcTemplate和Spring-data-jpa时&#xff0c;都使用了单数据源。在单数据源的情况下&#xff0c;Spring Boot的配置非常…

pyhon量化数据处理小细节3---日期格式转换

不同的数据文档&#xff0c;会获得不同日期格式&#xff0c;常见的有str(20200101),datetime(20200101),又或者是2020-01-01&#xff0c;,2020-1-1,20-1-1&#xff0c;20-Apr_20th,2020/01/01,20/01/01等等&#xff0c;总之类型很多。因此需要我们对日期格式进行统一化。这里我…

面向对象和基于对象

面向对象大家都很熟悉&#xff0c;可是基于对象就不一定了。两个听起来好象是同一回事&#xff0c;而事实上它们却千差万别。基于对象是指&#xff1a;我们采用对象封装技术&#xff0c;将数据和操作捆绑在一起&#xff0c;但是并没有合理地使用多态、继承等面向对象技术进行软…

CSS margin 属性简介

CSS margin 属性 设置外边距的最简单的方法就是使用 margin 属性。 margin 属性接受任何长度单位&#xff0c;可以是像素、英寸、毫米或 em。 margin 可以设置为 auto。更常见的做法是为外边距设置长度值。下面的声明在 h1 元素的各个边上设置了 1/4 英寸宽的空白&#xff1a;h…

MVC中使用代码创建数据库(code first +mysql+EF)

1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework、MySql.Data&#xff08;6.9.12&#xff09;和MySql.Data.Entity &#xff08;6.9.12&#xff09; 这里有几点要注意 1.MySql.Data和MySql.Data.Entity 版本必须一致 2.我试用了6.10的版本 要报错 3.我测试没有问…