堆排序

堆排序

1.定义

指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

2.基本思想

​ 将需要排序的序列构造成一个大/小顶堆,根据大/小顶堆的性质,当前堆的根节点(堆顶)就是序列中最大/小的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大/小顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了。

3.代码实现

public class HeapSort {
    public static void sort(int[] arr) {
        HeapSort heapSort = new HeapSort();

        //1.构建大顶堆
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            //从第一个非叶子结点从下至上,从右至左调整结构
            heapSort.adjustHeap(arr, i, arr.length);
        }

        for (int j = arr.length - 1; j > 0; j--) {
            //交换堆顶元素与末尾元素
            heapSort.swap(arr, 0, j);
            //调整大顶堆
            heapSort.adjustHeap(arr, 0, j);
        }

    }

    //调整大顶堆
    private void adjustHeap(int[] arr, int i, int length) {
        //取出当前元素
        int temp = arr[i];

        //判断当前元素的子元素大小
        for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {

            //如果右子元素大于左子元素。将k指向右子元素
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            //判断当前元素是否比子元素大,不大则进行交换。
            if (arr[k] > temp) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }


        }
        arr[i] = temp;
    }

    //交换元素
    private void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值