排序算法值--堆排序

        堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:

  Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]

  即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。

          堆分为大顶堆和小顶堆:

                  
大顶堆                                                                                小顶堆

算法思想(以大顶堆为例):
1.将长度为n的待排序的数组进行堆有序化构造成一个大顶堆(将数组--》转化为一个大顶堆)
 
2.将根节点与尾节点交换并输出此时的尾节点(交换节点)
 
3.将剩余的n -1个节点重新进行堆有序化(交换节点后继续有序化)
 
4.重复步骤2,步骤3直至构造成一个有序序列(重复2,3步骤)
 
假设待排序数组为[20,50,10,30,70,20,80]

具体程序实现:
public class HeapSort {
    private static void heapSort(int[] arr) {
        int len = arr.length -1;    //记得-1
        for(int i = len/2 1; i >=0; i --){ //堆构造,将数组转换为大顶堆
            heapAdjust(arr,i,len);
        }
        while (len >=0){
            swap(arr,0,len--);    //将堆顶元素与尾节点交换后,长度减1,尾元素最大
            heapAdjust(arr,0,len);    //,别忘了这一步,再次对堆进行调整
        }
    }
public static  void heapAdjust(int[] arr,int i,int len){
    int left,right,j ;
    while((left = 2*i+1) <= len){    //判断当前父节点有无左节点(即有无孩子节点,left为左节点)(注意是左节点,而不是右节点,下面才是右节点)
        right = left + 1;          //右节点
        j = left;                   //j"指针指向左节点"
        if(j < len && arr[left] < arr[right])    //判断右节点是否存在并且是否右节点大于左节点
            j ++;     //当前把"指针"指向右节点====》下一行的巧妙处理,j不加1,则是与左节点比较,加一则是与右节点比较
        if(arr[i] < arr[j])    //将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)
            swap(arr,i,j);
        else         //说明比孩子节点都大,直接跳出循环语句
            break;
        i = j;        // 子节点与父节点交换位置后,要重新进行堆调整,故将j的值赋予i;
    }
}
    public static  void swap(int[] arr,int i,int len){//交换两个数
             int temp = arr[i];
              arr[i] = arr[len];
             arr[len] = temp;
    }
    public static void main(String[] args) {//测试部分
        int array[] = {20,50,20,40,70,10,80,30,60};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        heapSort(array);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
    }
}

看完不懂可参考https://www.cnblogs.com/MOBIN/p/5374217.html


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

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

相关文章

linux 彻底删除oracle,Linux下完美卸载Oracle

先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Oracle时出现一个错误&#xff0c;倒致oracle没有安先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Orac…

oracle用户密码复杂度查询,11gR2 Database用户密码复杂度验证

已选择6行。关于密码版本的问题&#xff1a;SELECT USERNAME,PASSWORD_VERSIONS FROM DBA_USERS;USERNAME PASSWORD_VERSIONS------------------------------ -----------------JONES 10G 11GADAMS 10G 11GCLARK 10G 11GPRESTON 11GBLAKE 10GThe passwords for accounts jones,…

排序之--冒泡排序

冒泡排序&#xff1a;从大排到小&#xff1b;所谓冒泡&#xff0c;是指通过两两比较&#xff0c;将最大的数或者最小的数先冒出来。 例如数组&#xff1a;arr[] {53,48,80,98};arr[0]跟arr[1]比较&#xff0c;将大的放在arr[0]上&#xff0c;小的放在arr[1]上&#xff0c;通过…

oracle查询结果存入临时表,Oracle查询问题引发临时表使用

分析某段时间内&#xff0c;刷卡金额大于1000的卡的消费记录&#xff0c;写法如下。sql语句写法&#xff1a;select a.dno,a.dcard,a.dcard_money,a.dcard_type,a.ddate, a.dsubshop,a.dworker,a.dtype,j.Djf Dnowjf,b.dsje,B.Dcountfrom st_card_salemx a,( select m.dcard,Co…

排序之--选择排序

所谓选择排序&#xff0c;就是将数组中的最大值&#xff0c;或者最小值选出来。public class xuanze{public void maoPao(int []arr) {for(int i 0; i < arr.length-1;i) {int min i; //容易出错for(int j i1;j < arr.length;j) {// 这里也要区分冒…

oracle状态blocked,oracle 监听状态为BLOCKED

静态监听的状态是UNKNOWN。当数据库状态是OPEN时&#xff0c;动态监听是READY&#xff1b;当数据库状态是NOMOUNT时&#xff0c;动态监听状态是BLOCKED。LSNRCTL> statusConnecting to (DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST192.168.10.65)(PORT1521)))STATUS of the LIST…

插入排序--~

插入排序&#xff0c;顾名思义&#xff0c;就是先把前面的数排好&#xff0c;后面的数来一个就插入一个&#xff0c;来一双就插入两个~&#xff08;按顺序拍~&#xff09;public class daJiMu {public void maoPao(int []arr) {for(int i 1;i < arr.length;i) {for(int j …

oracle 12c alert,Oracle 12c DG备库Alert报错ORA-01110

环境是12.2.0.1 version, Oracle Data Guard备库今天故障恢复了一下&#xff0c;RMAN恢复后发现备库Alert一直报错&#xff0c;但是备库主库同步一致&#xff0c;数据一致。2018-07-05T23:42:22.18404808:00Errors in file /u01/app/oracle/diag/rdbms/dwjrstdydb/dwjrstdydb/t…

蓝桥杯大赛基础之--数列排序

题目&#xff1a;数列排序 问题描述  给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200输入格式  第一行为一个整数n。  第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。输出格式  输出一行&#…

linux窗帘文件夹命令,窗帘面板和电机 · 控客智能家居 Linux SDK 使用手册 · 看云...

## 开关停| OPEN | CLOSE | STOP || --- | --- | --- || 开 | 关 | 停 |### 请求json{"nodeId": "100","opcode": "SWITCH","arg": "OPEN","requester": "HJ_Server"}### 响应json{"nod…

关于maven面试的哪些事儿~

maven是什么&#xff1f; 优点&#xff1a; 1. Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。 2. 在多个开发团队环境时&#xff0c;Maven可以设置按标准在非常短的时间里完成配置工作&#xff0c;使开发人员的工作更加轻松。 3. Maven增加…

0640权限linux啥意思,linux系统rwx(421)、777权限详解

摘要linux的常见权限&#xff0c;mark一下常用的linux文件权限如下&#xff1a;r--r--r--rw-------rw-r--r--rw-rw-rw-rwx------rwxr--r--rwxr-xr-xrwxrwxrwx12345678从左至右&#xff0c;先是3个数字&#xff0c;代表文件的权限然后是9个字母(或者连字符)其中 1-3位数字代表文…

spring常见术语理解

SpringMVC工作流程&#xff1a;流程 1、用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 …

linux 智联 网卡设置,Linux初学者DNS配置指南(四)配置Bind常见问题

手把手教你如何配置Linux下的DNS(四)配置Bind常见问题一&#xff0e;rndc:connect failed: connection refused错误1.1.问题发生&#xff1a;配置DNS完成后&#xff0c;输入命令重启DNS服务使配置生效&#xff1a;/etc/rc.d/init.d/namedrestart或rdnc status出现rndc: connect…

mybatis那些事~

http://blog.csdn.net/qq_33824312/article/details/737710081.JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的&#xff1f;①数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能&#xff0c;如果使用数据库链接池可解决此问题。解决&#xff1a;在Sq…

linux绑定team网卡,linux 实现双网卡绑定单个IP——team篇

1、安装teamd[rootweb01 ~]# yum -y install teamd2、停止NetworkManager什么是NetworkManager呢&#xff1f;NetworkManager服务是管理和监控网络设置的守护进程&#xff0c;CentOS7更加注重使用NetworkManager服务来实现网络的配置和管理&#xff0c;CentOS7以前是通过networ…

postman新手使用教程

postman原理解析&#xff1a; 1。 在 postman中输入请求地址&#xff0c;并点击send按钮&#xff1b; 2. 对应的应用服务器收到该请求&#xff0c;并且返回对应的响应报文&#xff0c;并通过友好的可视化界面显示在界面上。

linux ssh服务,Linux配置SSH服务以便实现远程连接

Linux用户们一定想要知道该怎么开启SSH服务吧&#xff0c;SSH服务是Linux系统远程连接的重要方式&#xff0c;所以如何配置SHH服务也让很多用户感到纠结。现在小编就帮大家解决这个问题。配置方法&#xff1a;查询\安装SSH服务1.登陆linux系统&#xff0c;打开终端命令。输入 r…

玄学········为什么在eclipse上更改程序之后运行之后好像没更改一样

更改了半天&#xff0c;保存的了很多次&#xff0c;错误也改掉了&#xff0c;但是还是报同一个错误&#xff0c;很痛苦~搜了半天&#xff0c;终于搞定了&#xff0c;方法总结如下&#xff1a;一 可能是有一些文件没报存&#xff0c;设置让其自动保存&#xff1a;1 Windows-&g…

linux 用dg分区,[bug报告] 兼容性问题,mbr硬盘使用分区扩容后linux系统不认分区...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼原本机械硬盘A装了windowslinux双系统(mbr)如下&#xff1a;sda1&#xff1a;充当windows系统的C盘sda2&#xff1a;充当windows系统的D盘sda3&#xff1a;充当linux系统的启动盘 /bootsda4&#xff1a;充当linux系统的根目录 /后来…