java 堆排序实现原理

本文以数组array{2, 1, 4, 3, 6, 5, 7, 8}为例,详细阐述堆排序的实现过程:首先初建大根堆,从最下面第一个非叶子节点开始;接着进行调整,将最大数移动到根节点;然后将根节点与末尾元素交换,使最大元素位于正确位置;最后对剩余部分重复此过程,逐步形成有序序列。" 53418719,5651357,图的遍历:深度优先与广度优先,"['数据结构', '图', '图遍历', '深度优先', '广度优先']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组array{2, 1, 4, 3, 6, 5, 7, 8}为例,假设看做:

堆排序:

1、初建堆:把原数组调整成大根堆(根最大)自下而上,自右向左;

                   最下面(最右)第一个非叶子节点开始即arr[array.length / 2 - 1],比如上面数组是从arr[3]开始

2、调整,把最大数的调整到根节点:自上而下,自左向右

3、把根节点 a[0] (此时已经是最大)和最后一个叶子节点 arr[n] 调换位置,这样最后一个节点就是最大的了。

4、对着a[0]~a[n-1]重复步骤2和步骤3

慢慢的数组从尾部开始逐渐有序递增: a[n] > a[n-1] > a[n-2] >~~ >a[0]

import java.util.Arrays;

public class HeapSort{


    public static void main(String[] args) {
        int[] array = new int[]{2, 1, 4, 3, 6, 5, 7, 8};
        // 排序的主体逻辑
        sort(array);
        System.out.println(Arrays.toString(array));
    }


    public static void sort(int[] array) {
        // 建堆,按照自下而上,自右向左;(array.length / 2 - 1)是右下角非叶子节点
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            adjustHeap(array, i, array.length);
        }


        // 下面,开始排序逻辑,j是前一趟调整范围内数组的尾部
        for (int j = array.length - 1; j > 0; j--) {
            // 把大顶堆的根元素,放到数组的最后
            swap(array, 0, j);

            //自上而下,自左向右进行调整的
            adjustHeap(array, 0, j);
        }
    }


    public static void adjustHeap(int[] array, int s, int length) {
        //自上而下,自左向右一点点调整整棵树的部分,直到每一颗小子树都满足大根堆的规律为止
        //a[s]的左子树是a[2s+1],从左子树开始比较
        //循环2i+1是下一层的左子树
        for (int i = 2 * s + 1; i < length; i = 2 * i + 1) {
            //i + 1 < length放前面先判断,否则i+1容易数组下标越界
            if (i + 1 < length && array[i] < array[i + 1]) {
                i++;//[i]和[i+1]是左右子树,先找到比较大的那个,记录值较大的子树的下标i
            }

            // 如果子节点更大,根小,则两值进行交换,记录原根此时位置
            if (array[i] > array[s]) {
                swap(array, s, i);
                //s记录原根此时位置
                s = i;
            } else {
                // 如果根大,就直接终止循环了
                break;
            }
        }//for
    }


    public static void swap(int[] arr, int a, int b) {
        //三次异或交换两变量值
        arr[a]^=arr[b];
        arr[b]^=arr[a];
        arr[a]^=arr[b];
    }

}//HeapSort
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值