十大排序之堆排序

news/2024/5/19 4:28:59 标签: 二叉树, 算法, 数据结构, 堆排序

十大排序之堆排序(HeapSort)

十大排序之快速排序

十大排序之归并排序

十大排序插入排序

十大排序之堆排序

十大排序之冒泡排序

扫码关注公众号,更多资料尽在掌握。
在这里插入图片描述

1.简介
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法
堆排序的时间复杂度是:O(nlogn) 空间复杂度:O(1).
说到堆排序就不得不提到完全二叉树了。什么是完全二叉树呢?

完全二叉树定义:
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树
一颗普通的完全二叉树
在这里插入图片描述

我们把堆又分为大根堆和小根堆,

大根堆:根结点的键值是所有堆结点键值中最大者,在堆排序算法中用于升序排列。
在这里插入图片描述

小根堆:根结点的键值是所有堆结点键值中最小者,在堆排序算法中用于降序排列;
在这里插入图片描述

2.图解步骤

利用堆排序的实现排序的思路也很简单:

第一步、将待排序数组构建成一个堆(大根堆或者小根堆,一般用大根堆来升序排序);
第二步、把堆首(最大值)和堆尾互换;取出最大的元素(此时堆个数减一);
第三步、重新构建大根堆;
第四步、重复第二步,第三步,知道堆的大小为1,完成排序。

图解:
假设待排序数组:1,5,2,12,10,9

假设我们使用大根堆来排序:
在这里插入图片描述

将堆首元素和堆尾元素交换:
在这里插入图片描述

剔除最后一个元素,然后将剩下的元素,重新构建成一个堆。
在这里插入图片描述

继续交换堆首元素和堆尾元素
在这里插入图片描述

剔除最后一个元素,然后将剩下的元素,重新构建成一个堆。
在这里插入图片描述
交换:
在这里插入图片描述

剔除,构建堆。

在这里插入图片描述

交换,剔除。
在这里插入图片描述

交换,剔除。
在这里插入图片描述

最终完成排序:

1 2 5 9 10 12

3.代码实现

用大根堆实现排序:

package com.znzz.heapSort;


import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
        int[] arr = {2,4,1,8,20,3,6};
       new HeapSort().heap_sort(arr, arr.length);
        System.out.println(Arrays.toString(arr));
    }

    /**
     *
     * @param arr  待排数组
     * @param n    数组元素
     * @param i    对哪个节点做heapify
     */
    void heapify(int arr[], int n, int i){

        if(i >= n){
            return;
        }
           int c1 = 2 * i + 1;
           int c2 = 2 * i + 2;

           int max = i;
           if(c1 < n && arr[c1] > arr[max]){
               max = c1;
           }
           if(c2 < n && arr[c2] > arr[max]){
             max = c2;
           }
           if(max != i){
               swap(arr,max ,i);
               heapify(arr,n,max);
           }


}

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }


    void build_heap(int arr[], int n){
        int last_node = n -1;
        int parent = (last_node -1) /2;
        int i;
        for (i = parent; i >= 0; i--) {
            heapify(arr,n,i);
        }

    }


  void  heap_sort(int arr[], int n){
        build_heap(arr,n);
      for (int i = n -1; i >= 0 ; i--) {
            swap(arr,i,0);
            heapify(arr,i ,0);
      }
    }

}

小根堆排序(即降序排列)只需要把arr[c1] > arr[max] 和arr[c2] > arr[max] 中条件改为小于即可。


http://www.niftyadmin.cn/n/1563648.html

相关文章

idea配置文件注释快捷_IDEA 生成代码注释与方法注释的配置方法

在开发项目时&#xff0c;代码注释很重要。如果初期不注重代码规范&#xff0c;项目会在后期变得很难维护(当然如果是外包项目&#xff0c;一次交付注释写不写都没多大差别。)&#xff0c;特别是核心业务人员离职后会严重影响项目开发的进度。类注释配置方式创建文件时自动生成…

Java精选面试题

Java精选面试题 分享一些很高频的Java面试题&#xff0c;里面涵盖了各种技术点&#xff0c;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈&#xff0c;差不多1000多道。 获…

tomcat不能正常启动: java.io.EOFException

2019独角兽企业重金招聘Python工程师标准>>> 转&#xff1a;Tomcat&#xff1a;IOException while loading persisted sessions: java.io.EOFException解决手记 一直用tomcat一段时间都正常无事&#xff0c;最近一次启动tomcat就发生以下异常&#xff1a; 严重: IOE…

vue给指定class设置css样式_vue中class和style设置的相关方法

class&style样式设置classhtml代码阿斯顿发css代码.red {color: red;}.gray {background-color: gray;}js代码window.onload function() {new Vue({el: #box,data: {red: red,gray: gray}});}样式生效的写法:class"[red, gray]" 调用的是vue参数里的data属性:cl…

Mybatis的逆向工程的使用(mybatis generator)

Mybatis的逆向工程的使用&#xff08;mybatis generator&#xff09; 一。编写配置文件。 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//…

MySQL执行外部sql脚本

1&#xff1a;&#xff5e;/mysql_test/test.sql 1 create table student(2 sno int not null primary key auto_increment,3 sname varchar(20) not null4 ) engineMyISAM default charsetutf8; 2&#xff1a;在控制台下执行。mysql> source ~/mysql_test/test.sql…

doris历程_Doris简史-为分析而生的11年

Apache Doris (incubating) 从2008年第一个版本开始到今天(2019年)已经走过了11个年头。期间&#xff0c;Doris从最初的只为解决百度凤巢报表的专用系统&#xff0c;已经成长为目前国内唯一的分析型数据库孵化项目。一路走来&#xff0c;Doris的初心从未改变。「Apache Doris —…

计算机程序是怎样运行的

关于《深入理解计算机系统》 “这本书的中译名为“深入理解计算机系统”&#xff0c;我非常&#xff0c;十分&#xff0c;以及百分之一百二十地不满意。我这么说的原因在于这个译法完全扭曲了书的本意。如果直译原书名&#xff0c;应该是类似于“以程序员的视角理解计算机系统”…