堆排序

1.堆排序

package com.deng.tree;

import java.util.Arrays;

/**
 * @author DengZhuo
 * @version 1.0
 * @date 2020/12/24 0024 22:08
 * 堆排序
 */
public class HeapSort {
    public static void main(String[] args) {
        //要求将数组进行升序排序
        int arr[] = {4, 6, 8, 5, 9,-96,0};
        heapSort(arr);
    }

    //编写一个堆排序的方法
    public static void heapSort(int arr[]) {
        int temp =0;
        System.out.println("堆排序!");
//        adjustHeap(arr,1,arr.length);
//        System.out.println("第一次"+ Arrays.toString(arr));
//
//        adjustHeap(arr,0,arr.length);
//        System.out.println("第二次"+ Arrays.toString(arr));

        //最终代码
        //1.将无序序列构建成一个堆,根据升序降序需求选择大顶堆或者小顶堆
        for (int i=arr.length/2-1;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }


        //2.将堆顶元素与末尾元素交换,将最大元素“ 沉”到数组末端
        //3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序
        for (int j=arr.length-1;j>0;j--){
            //交换
            temp= arr[j];
            arr[j]=arr[0];
            arr[0]=temp;
            adjustHeap(arr,0,j);
        }
        System.out.println("数组"+ Arrays.toString(arr));
    }
    //将一个数组调整为一个大顶堆

    /**
     * @param arr    待调整的数组
     * @param i      表示非叶子节点在数组中的索引
     * @param length 表示对对多少个元素进行调整  length是在逐渐减少
     */
    public static void adjustHeap(int arr[], int i, int length) {
        int temp = arr[i];//先取出当前元素的值,保存在临时变量
         for (int k =i*2+1;ktemp){//如果子节点大于父节点
                 arr[i]=arr[k];//把较大的值赋给当前节点
                 i=k;//i指向k,继续循环比较
             }else {
                 break;
             }
         }
         //当for循环结束后,我们已近将以i为父节点的树的最大值,放在了最顶(局部)
        arr[i]=temp;//将temp值放到调整后的位置
    }
}

运行结果:
图片.png

你可能感兴趣的:(堆排序)