Java 堆排序实例(大顶堆、小顶堆)

下面我将为您介绍 Java 堆排序实例(大顶堆、小顶堆)的完整攻略。

1. 堆排序介绍

堆排序是一种树形选择排序方法,它的特点是将数组看成一棵完全二叉树,然后通过建立堆(一种特殊的完全二叉树),逐个取出堆顶元素并重新建堆的过程来进行排序。具体来说,堆排序可以分为两种:大顶堆排序和小顶堆排序。

在大顶堆排序中,堆顶元素最大,从小到大进行排序;在小顶堆排序中,堆顶元素最小,从大到小进行排序。

下面我们将通过示例的方式来讲解 Java 堆排序实例(大顶堆、小顶堆)的攻略。

2. Java 堆排序示例

2.1 大顶堆排序示例

public class HeapSort {
    public void sort(int arr[]) {
        int n = arr.length;
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
        for (int i = n - 1; i >= 0; i--) {
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            heapify(arr, i, 0);
        }
    }

    void heapify(int arr[], int n, int i) {
        int largest = i;
        int l = 2 * i + 1;
        int r = 2 * i + 2;
        if (l < n && arr[l] > arr[largest])
            largest = l;
        if (r < n && arr[r] > arr[largest])
            largest = r;
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
            heapify(arr, n, largest);
        }
    }

    public static void main(String args[]) {
        int arr[] = { 12, 11, 13, 5, 6, 7 };
        HeapSort ob = new HeapSort();
        ob.sort(arr);
        System.out.println("Sorted array is");
        for (int i = 0; i < arr.length; ++i)
            System.out.print(arr[i] + " ");
    }
}

以上代码实现的是大顶堆排序,通过建立大顶堆,每次将堆顶元素(即最大值)取出,然后重新建堆的过程来进行排序。

具体的实现流程如下:

  1. 将数组转换成堆,从最后一个非叶子节点开始调整堆的结构,保证所有的子树都符合堆的要求,这个过程叫做 heapify。这一步的过程是从后往前遍历所有的非叶子节点,逐个地将其线性化,即如果有两个子节点,则将它们的值中较大者作为该节点的值,以此类推,直至根节点。

  2. 得到堆之后,每次将堆顶元素取出,然后将堆的末尾元素替换到堆顶,再重新调整堆的结构。

  3. 重复步骤 2 直到堆为空。

最终输出的结果为:Sorted array is 5 6 7 11 12 13。

2.2 小顶堆排序示例

public class HeapSort {
    public void sort(int arr[]) {
        int n = arr.length;
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
        for (int i = n - 1; i >= 0; i--) {
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            heapify(arr, i, 0);
        }
    }

    void heapify(int arr[], int n, int i) {
        int smallest = i;
        int l = 2 * i + 1;
        int r = 2 * i + 2;
        if (l < n && arr[l] < arr[smallest])
            smallest = l;
        if (r < n && arr[r] < arr[smallest])
            smallest = r;
        if (smallest != i) {
            int swap = arr[i];
            arr[i] = arr[smallest];
            arr[smallest] = swap;
            heapify(arr, n, smallest);
        }
    }

    public static void main(String args[]) {
        int arr[] = { 12, 11, 13, 5, 6, 7 };
        HeapSort ob = new HeapSort();
        ob.sort(arr);
        System.out.println("Sorted array is");
        for (int i = 0; i < arr.length; ++i)
            System.out.print(arr[i] + " ");
    }
}

以上代码实现的是小顶堆排序,与大顶堆排序的主要区别是调整堆的过程中要使得所有子树符合小顶堆的要求,即每个节点的值都小于其子节点的值。

最终输出的结果为:Sorted array is 13 12 11 7 6 5。

总结

在本文中,我们介绍了堆排序的概念和实现方法,并通过两个示例分别讲解了大顶堆排序和小顶堆排序的实现方法。堆排序作为一种高效的排序算法,在实际的编程中应用广泛,希望本文的介绍能够帮助读者更好地掌握堆排序的知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 堆排序实例(大顶堆、小顶堆) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • js算法中的排序、数组去重详细概述

    JS算法中的排序、数组去重详细概述 排序算法 在JavaScript中,常用的排序算法有冒泡排序、插入排序、选择排序、快速排序等。下面将分别对他们进行介绍。 冒泡排序 冒泡排序是一种稳定的排序算法,它的基本思想是从左到右依次比较相邻两个元素的大小,并且将较大的元素向右移动,较小的元素向左移动。重复这个过程直到没有任何元素需要移动为止。 下面是冒泡排序的Jav…

    算法与数据结构 2023年5月19日
    00
  • C++堆排序算法的实现方法

    C++堆排序算法的实现方法 堆排序是一种高效的排序算法,使用一定程度的空间复杂度换来更快的时间复杂度。下面将详细讲解C++中堆排序算法的实现方法。 算法实现步骤: 将待排序数组构建成一个二叉堆。 将堆顶元素与堆底元素进行交换。 对除了堆底元素以外的堆进行调整,使其重新成为一个新的堆。 重复2、3步骤,直到整个数组排序完成。 代码实现 C++中STL容器提供了…

    算法与数据结构 2023年5月19日
    00
  • 解析左右值无限分类的实现算法

    下面为你详细讲解“解析左右值无限分类的实现算法”的完整攻略: 1. 了解左右值无限分类 左右值无限分类,也称为嵌套集合模型,是一种常见的无限分类方式。在该模型中,每个分类都有一个左值和右值,通过比较左右值大小,可以判断出一个分类是否是另一个分类的子分类或者父分类。支持多层级分类,可以无限嵌套。 2. 左右值无限分类的实现算法 左右值无限分类的实现算法分为两步…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现经典排序算法之冒泡排序

    JavaScript实现经典排序算法之冒泡排序 什么是冒泡排序? 冒泡排序是一种简单的排序算法,从序列左侧开始比较两个相邻的元素,如果顺序不对就交换位置,直到序列末尾,这样一次遍历后,序列最后一个元素就是当前序列最大值。然后对剩余序列重复上述过程,直到整个序列有序。 算法实现 我们来看看如何用JavaScript实现冒泡排序。 function bubble…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中三种常见的排序方法

    请听我详细讲解JavaScript中三种常见的排序方法。 什么是排序算法 排序算法是一种基本的算法,用于将一组数据按照某种规则进行排序。在实际开发中,排序算法被广泛应用于数据的处理和管理中。 JavaScript中三种常见的排序方法 在JavaScript中,常见的排序算法有以下三种: 冒泡排序 冒泡排序(Bubble Sort)是一种基本的排序算法,通常通…

    算法与数据结构 2023年5月19日
    00
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    STL常用算法介绍 STL(Standard Template Library)是C++标准库的一个庞大组成部分,提供了大量的常用算法,容器以及迭代器等等。这些工具都可以被拿来用来解决大部分的计算问题。其中stl常用算法主要包括排序算法和非变序型队列,下面进行详细讲解。 stl排序算法 STL提供了丰富的排序算法模板,可以直接拿来使用,无需重新实现。以下是一…

    算法与数据结构 2023年5月19日
    00
  • Go归并排序算法的实现方法

    Go归并排序算法的实现方法 简介 归并排序(Merge Sort)是一种经典的分治算法,它将一个大问题分解为若干个小问题,通过递归将小问题排好序,最后再将小问题合并起来,得到排序的结果。 归并排序的最坏时间复杂度为$ O(nlogn)$,且具有稳定性,是较为优秀的排序算法之一。 实现方法 归并排序的实现分为两个步骤,分别是分解和合并: 分解 分解过程需要递归…

    算法与数据结构 2023年5月19日
    00
  • C语言实现交换排序算法(冒泡,快速排序)的示例代码

    C语言实现交换排序算法(冒泡排序、快速排序)通常分为以下步骤: 分析算法:首先,我们需要对选定的排序算法进行仔细的分析,了解排序过程中的基本操作、时间复杂度和空间复杂度等基本信息。 编写函数:依照分析结果,编写函数实现排序算法。同时,考虑如何优化代码以提高排序效率。 测试函数:编写测试代码对排序函数进行测试,检查是否正确。 以下是两个示例说明: 冒泡排序 冒…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部