• 排序算法(二)选择排序---堆排序


     概念:利用树结构进行排序。

     分类:1、大顶堆: 每个小树的根节点都大于子节点     升序排序使用大顶堆

        2、小顶堆:每个小树的子节点都大于根节点   降序排序使用小顶堆

     

     1 public class HeapSort {
     2     
     3     public static void main(String[] args){
     4         int[] arr=new int[]{9,6,7,0,1,10,4,2};
     5         System.out.println(Arrays.toString(arr));
     6         heapSort(arr);
     7         System.out.println(Arrays.toString(arr));
     8     }
     9     
    10     public static void heapSort(int[] arr){
    11             //开始位置是最后一个非叶子节点,即最后一个节点的父节点
    12             int start=(arr.length-1)/2;
    13             //调整为大顶堆
    14             for(int i=start;i>=0;i--){
    15                 maxHeap(arr,arr.length,i);
    16             }
    17             //先把数组中的第0个和堆中最后一个数交换位置,再把前面的处理为     大顶堆
    18             for(int i=arr.length-1;i>0;i--){
    19                 int temp=arr[0];
    20                 arr[0]=arr[i];
    21                 arr[i]=temp;
    22                 maxHeap(arr,i,0);
    23             }
    24     }
    25     
    26     // size:数组在后面依次先前遍历                        当前节点
    27     public static void maxHeap(int[] arr,int size,int index){
    28         //左子节点
    29         int leftNode=2*index+1;
    30         //右子节点
    31         int rightNode=2*index+2;
    32         int max=index;
    33         //和两个子节点分别对比,找出最大的节点
    34         if(leftNode<size&&arr[leftNode]>arr[max]){
    35             max=leftNode;
    36         }
    37         if(rightNode<size&&arr[rightNode]>arr[max]){
    38             max=rightNode;
    39         }
    40         //交换位置
    41         if(max!=index){
    42             int temp=arr[index];
    43             arr[index]=arr[max];
    44             arr[max]=temp;
    45             //交换位置以后,可能会破坏之前排好的堆,所以,
    46             maxHeap(arr,size,max);
    47         }
    48         
    49         
    50     }
    51 }
    52          
    好好学习,天天向上。 努力工作,给自己的和家人一个满意的答案。。。。
  • 相关阅读:
    mybatis源码阅读-Transaction和TransactionFactory(四)
    mybatis源码阅读-SqlSessionFactory和SqlSession(三)
    mybatis使用-高级用法(二)
    mybatis使用-helloword(一)
    Spring Boot-全局异常处理(八)
    Spring Boot-定义拦截器(七)
    Spring Boot-整合redis(六)
    Spring Boot-热部署和Debugger使用(三)
    Spring Boot-整合Mybatis(五)
    netty自定义协议 心跳 断线重连源码
  • 原文地址:https://www.cnblogs.com/axu521/p/9986371.html
Copyright © 2020-2023  润新知