模拟实现堆排序

堆排序的基本介绍

在这里插入图片描述在这里插入图片描述

堆排序 的基本思想

在这里插入图片描述

基本步骤

在这里插入图片描述
1.数组结构情况
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现:

package tree;

import java.util.Arrays;

/**
 * @author 一介草莽子
 * version 1.0
 */
@SuppressWarnings({"all"})
public class HeapSort {
    public static void main(String[] args) {
        int arr[] = {4, 6, 8, 5, 9};
        heapSort(arr);
    }

    public static void heapSort(int[] arr) {
        //将一个无序序列构成一个堆
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjuctHeap(arr, i, arr.length);//第一次i=1
        }
        int temp = 0;
        //将堆顶元素和末尾元素交换 把当前最大值放到最后
        for (int j = arr.length - 1; j >= 0; j--) {
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            //重新调整堆结构(调整为大顶堆或小顶堆)
            adjuctHeap(arr, 0, j);
        }
        System.out.println("排序之后");
        //打印
        System.out.println(Arrays.toString(arr));


    }
    //将一个数组(二叉树) 转换为大顶堆

    /**
     * 功能:将以 i为非叶子节点的数调整成大顶堆
     *
     * @param arr    带调整的数组
     * @param i      表示非叶子节点在数组中的索引
     * @param length 表示对多少个数组元素调整
     */
    public static void adjuctHeap(int arr[], int i, int length) {
        //取出当前变量的值 放到临时变量 暂存
        int temp = arr[i];
        // k=i*2+1 是i节点的左叶子节点
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {

            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++; //k指向i节点下面的较大的右子节点
            }
            if (arr[k] > temp) {
                arr[i] = arr[k];//把子节点赋值给父节点位置
                i = k;//i指向k继续循环
            } else {
                break; //如果子节点不大于父节点就不用向上提 直接退出
            }
        }
        arr[i] = temp;//将i放到调整之后的地方
    }

}

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值