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日

相关文章

  • C语言深入探究直接插入排序与希尔排序使用案例讲解

    C语言深入探究直接插入排序与希尔排序使用案例讲解 直接插入排序 算法描述 直接插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。具体算法流程如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排…

    算法与数据结构 2023年5月19日
    00
  • C语言排序方法(冒泡,选择,插入,归并,快速)

    下面是关于C语言排序方法冒泡、选择、插入、归并、快速的详细攻略: 冒泡排序 冒泡排序是一种最简单的排序算法,它的核心思想是从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,就交换它们的位置,这样一遍比较后,最大的元素就会被“冒泡”到最右边。然后再对剩余的元素重复同样的操作,这样一直迭代直到整个序列排序完成。 下面是标准的C语言冒泡排序代码示例: …

    算法与数据结构 2023年5月19日
    00
  • 2019年京东前端工程师面试题(附答案)

    本次将会以京东前端工程师面试题为例,详细讲解如何准备和应对前端岗面试。 第一步:了解面试整体流程和考察的技能点 在准备面试前,需要先了解面试的整体流程和所考察的技能点,从而根据需要和缺点来进行有针对性的准备。 面试的整体流程一般包括: 自我介绍和岗位广告 聊聊项目和技术栈 问题解答和技术评测 算法/编码能力测试 HR面试 而在前端工程师的岗位面试中,考察的技…

    算法与数据结构 2023年5月19日
    00
  • 如何用JavaScript学习算法复杂度

    下面是关于如何用JavaScript学习算法复杂度的完整攻略: 1. 什么是算法复杂度? 算法复杂度指的是算法运行时间与输入数据规模之间的关系。通常使用大O表示法来表示算法的时间复杂度,即在最坏情况下,算法需要执行的基本操作次数和输入规模n的关系。从时间复杂度的角度出发,我们可以比较不同的算法及其优劣。 2. JavaScript中如何编写算法 JavaSc…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现双路快速排序算法原理

    作为网站的作者,我很愿意为大家详细介绍C/C++实现双路快速排序算法原理。下面是详细的攻略,分为以下几个部分: 1. 什么是双路快排算法 双路快排(Dual-Pivot Quick Sort)算法是一种高效的排序算法。该算法是快速排序(Quick Sort)的一种改进。 双路快排算法的基本思想是:选取两个基准值(pivot)来进行排序,将数组划分为三部分:小…

    算法与数据结构 2023年5月19日
    00
  • asp下几种常用排序算法

    我将为您详细讲解ASP下几种常用排序算法的完整攻略。 一、排序算法简介 排序算法是计算机科学中非常基础的算法之一。它是将一组数据中的元素按照某种规则进行排序的过程。排序算法是计算机程序设计的基础,它涉及到数据结构、算法、模式识别等计算机科学领域内的基础理论。 排序算法主要分为以下几种: 冒泡排序 选择排序 插入排序 快速排序 归并排序 本文将针对ASP下几种…

    算法与数据结构 2023年5月19日
    00
  • JS实现的全排列组合算法示例

    下面针对 “JS实现的全排列组合算法示例” 给出完整攻略。 什么是全排列组合算法? 全排列组合是指将一个集合中的元素排成一列,可以有不同的排列方式,这些不同的排列方式就称为全排列。当从这个集合中取出一部分排成一列时,称为排列,而取出一部分组合称为组合。 JS实现全排列组合算法的步骤 具体实现全排列组合算法的步骤如下: 定义需要排列和组合的数组或字符串; 定义…

    算法与数据结构 2023年5月19日
    00
  • C++实现希尔排序(ShellSort)

    下面是关于C++实现希尔排序(ShellSort)的攻略。 什么是希尔排序? 希尔排序是插入排序的一种改进版本,与普通插入排序不同的是,它会先将数组按一定间隔 gap 分成若干个小组进行插入排序,然后缩小间隔再分组排序,直到最后 gap 为 1,此时整个序列就是有序的。希尔排序的本质就是分组的插入排序。 希尔排序的代码实现 下面针对希尔排序的核心代码进行讲解…

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