美文网首页
选择排序---堆排序

选择排序---堆排序

作者: 水欣 | 来源:发表于2018-03-02 15:29 被阅读0次

二叉堆的定义

二叉堆是完全二叉树或者是近似完全二叉树。
二叉堆满足两个特性:

  • 父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值
  • 每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)
    当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:


    11B3620D-3236-4882-89D8-0E45CDA8A62D.png

堆的存储

一般都用数组来表示堆,i节点的父节点下标为(i-1)/2。它的左右子节点下标分别为2i+1和2i+2。如第0个节点左右子节点下标分别为1和2.

1A2BD5F2-D816-4846-A220-5C068D3C132C.png

java代码

public static void heapSort(int[] arr) {
        // 将待排序的序列构建成一个大顶堆
        for (int i = arr.length / 2; i >= 0; i--) {
            heapAdjust(arr, i, arr.length);
        }

        // 逐步将每个最大值的根节点与末尾元素交换,并且再调整二叉树,使其成为大顶堆
        for (int i = arr.length - 1; i > 0; i--) {
            swap(arr, 0, i); // 将堆顶记录和当前未经排序子序列的最后一个记录交换
            heapAdjust(arr, 0, i); // 交换之后,需要重新检查堆是否符合大顶堆,不符合则要调整
        }
    }

    /**
     * 构建堆的过程
     *
     * @param arr 需要排序的数组
     * @param i   需要构建堆的根节点的序号
     * @param n   数组的长度
     */
    private static void heapAdjust(int[] arr, int i, int n) {
        int currentIndex = i;
        while (currentIndex <= n / 2 - 1) {
            int leftChildIndex = currentIndex * 2 + 1;
            int maxChildIndex = leftChildIndex;
            if (leftChildIndex < n - 1) {
                if (arr[leftChildIndex] < arr[leftChildIndex + 1]) {
                    maxChildIndex = leftChildIndex + 1;
                }
            }
            if (arr[currentIndex] < arr[maxChildIndex]) {
                int temp = arr[currentIndex];
                arr[currentIndex] = arr[maxChildIndex];
                arr[maxChildIndex] = temp;
                currentIndex = maxChildIndex;
            } else {
                break;
            }
        }
    }

相关文章

  • 排序

    目的 方便查找 内排序 交换 冒泡排序 快速排序 选择 直接选择 堆排序 插入 -直接插入 堆排序 基数排序

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • 排序

    一、选择排序 1.堆排序 定义:堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序可参考http...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • 常见的排序算法-2.1 选择排序(堆排序)

    选择排序的优化方案(堆排序)

  • iOS - 堆排序

    Demo_github 堆排序 堆排序(Heap Sort)是一种树形选择排序,是对直接选择排序的有效改进。 堆的...

  • 排序算法

    冒泡排序 插入排序 选择排序 归并排序 堆排序

  • 选择排序法

    常用的选择排序方法有两种:直接选择排序和堆排序。直接排序简单直观,但性能略差;堆排序是一种较为高效的选择排序方法,...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • 常用算法 2018-08-31

    冒泡排序 堆排序 归并排序 快速排序 插入排序 选择排序

网友评论

      本文标题:选择排序---堆排序

      本文链接:https://www.haomeiwen.com/subject/mrqbxftx.html