java排序之堆排序

news/2024/5/19 6:47:33 标签: 数据结构, 排序算法, 堆排序, 算法

从大到小排:构造大顶堆,不交换根节点和末尾节点

package cn.itcast.test.sort;

import org.junit.Test;

import java.util.Arrays;

public class HeapSort {
    public static void heapSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }

        int len = arr.length;
        // 构建大顶堆,这里其实就是把待排序序列,变成一个大顶堆结构的数组
        buildMaxHeap(arr, len);
    }
    private static void buildMaxHeap(int[] arr, int len) {
        // 从最后一个非叶节点开始向前遍历,调整节点性质,使之成为大顶堆
        for (int i = (int)Math.floor(len / 2) - 1; i >= 0; i--) {
            heapiAdjust(arr, i, len);
        }

//        //调整堆结构,交换堆顶元素与末尾元素
//        for(int j=arr.length-1;j>0;j--){
//            swap(arr,0,j);//将堆顶元素与末尾元素进行交换
//            heapiAdjust(arr,0,j);//重新对堆进行调整
//        }
    }
    private static void heapiAdjust(int[] arr, int i, int len) {
        // 先根据堆性质,找出它左右节点的索引
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        // 默认当前节点(父节点)是最大值。
        int largestIndex = i;
        if (left < len && arr[left] > arr[largestIndex]) {
            // 如果有左节点,并且左节点的值更大,更新最大值的索引
            largestIndex = left;
        }
        if (right < len && arr[right] > arr[largestIndex]) {
            // 如果有右节点,并且右节点的值更大,更新最大值的索引
            largestIndex = right;
        }

        if (largestIndex != i) {
            // 如果最大值不是当前非叶子节点的值,那么就把当前节点和最大值的子节点值互换
            swap(arr, i, largestIndex);
            // 因为互换之后,子节点的值变了,如果该子节点也有自己的子节点,仍需要再次调整。
            heapiAdjust(arr, largestIndex, len);
        }
    }

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

    @Test
    public void test(){
        int []arr = {8,6,3,44,12,99,1};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

}

结果
在这里插入图片描述
从小到大排:构造大顶堆,交换根节点和末尾节点

package cn.itcast.test.sort;

import org.junit.Test;

import java.util.Arrays;

public class HeapSort {
    public static void heapSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }

        int len = arr.length;
        // 构建大顶堆,这里其实就是把待排序序列,变成一个大顶堆结构的数组
        buildMaxHeap(arr, len);
    }
    private static void buildMaxHeap(int[] arr, int len) {
        // 从最后一个非叶节点开始向前遍历,调整节点性质,使之成为大顶堆
        for (int i = (int)Math.floor(len / 2) - 1; i >= 0; i--) {
            heapiAdjust(arr, i, len);
        }

        //调整堆结构,交换堆顶元素与末尾元素
        for(int j=arr.length-1;j>0;j--){
            swap(arr,0,j);//将堆顶元素与末尾元素进行交换
            heapiAdjust(arr,0,j);//重新对堆进行调整
        }
    }
    private static void heapiAdjust(int[] arr, int i, int len) {
        // 先根据堆性质,找出它左右节点的索引
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        // 默认当前节点(父节点)是最大值。
        int largestIndex = i;
        if (left < len && arr[left] > arr[largestIndex]) {
            // 如果有左节点,并且左节点的值更大,更新最大值的索引
            largestIndex = left;
        }
        if (right < len && arr[right] > arr[largestIndex]) {
            // 如果有右节点,并且右节点的值更大,更新最大值的索引
            largestIndex = right;
        }

        if (largestIndex != i) {
            // 如果最大值不是当前非叶子节点的值,那么就把当前节点和最大值的子节点值互换
            swap(arr, i, largestIndex);
            // 因为互换之后,子节点的值变了,如果该子节点也有自己的子节点,仍需要再次调整。
            heapiAdjust(arr, largestIndex, len);
        }
    }

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

    @Test
    public void test(){
        int []arr = {8,6,3,44,12,99,1};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

}

在这里插入图片描述


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

相关文章

苹果系统 python闪退怎么解决_双击py文件闪退怎么办_py文件打开闪退的解决方法...

Python文件是以.py为后缀的文件&#xff0c;可以用Python直接运行&#xff0c;但是有的朋友会发现&#xff0c;Python文件打不开了&#xff0c;点击闪退。那么双击py文件闪退怎么办呢&#xff1f;别急&#xff0c;小编现在就为大家带来py文件打开闪退的解决方法。 py文件打开闪…

@Resource与@Autowired用法区别

这个链接讲的非常清楚&#xff0c;大家可以参考一下 https://blog.csdn.net/magi1201/article/details/82590106?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_ideaccbb45-ead5-41f8-afec-7664d937bfcb&…

springboot controller访问不到_springboot学习笔记

Spring Boot 微框架(2020版)1. springboot的引言Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不 再需要定义样板化的配置。通过这种方式&#x…

! [rejected] master -> master (fetch first)问题的解决方案

今天在做git push时出现了一下问题 我感觉可能是版本不一致的原因&#xff0c;在这里给大家三种解决方案 方法一&#xff1a; 1、通过git pull 先将本地库更新到与远程库一致的版本&#xff0c;但要注意本地库后来做的修改可能被覆盖&#xff0c;最好使用git fetch(不会自动合…

html静态登录界面代码_如何快速搭建静态网站

“ 在日常运用场景中&#xff0c;由于便捷、低开发成本&#xff0c;静态网站常被作为快速建站的一个备选方案&#xff0c;它可以满足许多内容相对固定的网站建站需求&#xff0c;例如企业官网(介绍、产品展示等)、个人简历网站等。因为内容不常更新&#xff0c;所以可以不带管理…

java中字符串,数组,ArrayList的相互转换

最近写java算法程序时总是用到字符串&#xff0c;数组&#xff0c;ArrayList的相互转换&#xff0c;下面直接上代码了&#xff0c;全部都在代码中注释好了。大家感兴趣可以自己查看。 package cn.itcast.test;import org.junit.Test;import java.util.ArrayList; import java.…

java 远程修改linux服务器文件_Linux服务器之间文件如何实现实时同步传输

1最近在做服务器迁移的时候&#xff0c;遇见了一个很头疼的问题。那就是我原本的服务器数据实在是太多了高达250G&#xff0c;而且不能在短时间立马切换。所以需要一个过渡期&#xff0c;但是在此期间又会新增文件或者用户修改文件&#xff0c;那么如何实时传输文件的时候仅仅传…

mysql把一个表格的最新数据更新到另一个表格

在网上找了好多资料都没有办法运行出来&#xff0c;下面分享大家正确的法式。 把student的最新年龄更新到newstdent表格中&#xff0c;表结构如下 CREATE TABLE student(id INT,NAME VARCHAR(32),age INT ); SHOW TABLES; DESC student;INSERT INTO student VALUES(1,"小…