Java--算法--堆排序

  1. 堆排序的基本介绍:
  2. 堆排序的代码实现:

    1.  

       

       

    2.  

       

    3.  

       

    4.  

       

    5.  

       

    6.  

       

        

    7. package com.model.tree;
      
      import java.util.Arrays;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/7/14 16:34
       * 树的实际应用:堆排序
       */
      public class TreeDemo04 {
          public static void main(String[] args) {
              int[] array={4,6,8,5,9,-1,555,67};
      //        heapOrder(array);
      
              heapSearch(array);
              System.out.println(Arrays.toString(array));
          }
      /*
          public static void heapOrder(int[] array){
              int temp=0;
              for (int i = array.length/2-1; i >=0; i--) {
                  adjustHeap(array, i ,  array.length);
              }
      //        adjustHeap(array, 0,  array.length);
              for (int j = array.length-1; j >0 ; j--) {
                  temp=array[j];
                  array[j]=array[0];
                  array[0]=temp;
                  adjustHeap(array, 0, j);
              }
              System.out.println(Arrays.toString(array));
          }*/
          /**
           * @param array :要调整的数组
          // * @param i :要调整的根节点
           * @param length :要调整的数组的长度
           * @Return void
           */
          /*
          public static void  adjustHeap(int[] array,int i,int length){
      //        将数调整为大顶堆的树,此节点的下子节点中最大的值放在此节点上
              int temp=array[i]; //j=2*i+1:左子树的下标,2*j+1:子节点的子节点
              for (int j = 2*i+1; j < length; j=2*j+1) {
      //            比较一下左子树的值大还是右子树的值大
                  if (j+1<length&&array[j]<array[j+1]){
                      j++;//让指针指向右子树
                  }
                  if (temp<array[j]){
                      array[i]=array[j];
                      i=j;
                  }else {
                      break;
                  }
              }
              array[i]=temp;
          }
          */
      //    调整为大顶堆的树
          public static void buildTree(int[] array,int length){
      //        对所有的非叶子节点从下到上,从左到右进行,检查,其是否时最大的值
              for (int i = length/2-1; i >=0; i--) {
                  int j=i*2+1; //左节点
                  if (j+1<length&&array[j]<array[j+1]){//左节点的值小于右节点的值
                      j++;
                  }
                  if (array[j]>array[i]){//非叶子节点和子节点中较大的值进行交换
                      int temp=array[i];
                      array[i]=array[j];
                      array[j]=temp;
                  }
              }
      
          }
          public static void heapSearch(int[] array){
              for (int i = array.length-1; i >=0; i--) {
                  buildTree(array, i+1);
                  int temp=array[i];
                  array[i]=array[0];
                  array[0]=temp;
              }
          }
      }

       

       

       

posted @ 2021-07-14 17:46  张紫韩  阅读(66)  评论(0编辑  收藏  举报