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日

相关文章

  • 浅谈2路插入排序算法及其简单实现

    浅谈2路插入排序算法及其简单实现 概述 2路插入排序算法是插入排序算法的一种变体,其主要思想是将待排序数据集分成两个子序列,分别进行插入排序,最后将两个排好序的子序列合并成一个有序序列。2路插入排序算法比普通的插入排序算法在特定数据集下可以获得更好的排序效果。 实现思路 2路插入排序算法可以分为以下几个步骤: 将待排序数据集按照大小分成两个子序列,分别进行插…

    算法与数据结构 2023年5月19日
    00
  • C语言每日练习之选择排序

    C语言每日练习之选择排序 选择排序算法简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思路是在未排序的数列中,从前往后依次选择最小的数,和第一个数进行交换,然后在剩余的数列中从前往后选择最小的数,与第二个数进行交换,直到选择到最后一个数为止。 选择排序的时间复杂度为O(n²),属于较慢的排序算法,但是它的实现简单易懂,不需要额…

    算法与数据结构 2023年5月19日
    00
  • Java 十大排序算法之计数排序刨析

    Java 十大排序算法之计数排序刨析 算法介绍 计数排序是一个时间复杂度为O(n+k)的非基于比较的排序算法,其中n是待排序元素的个数,k是待排序元素的范围,即待排序元素的最大值减去最小值再加1。 算法通过构建一个长度为k的计数数组来统计每个元素出现的次数,然后借助计数数组按顺序输出每个元素,就完成了排序过程。 因为计数排序是非基于比较的算法,因此可以在一定…

    算法与数据结构 2023年5月19日
    00
  • C++递归实现选择排序算法

    实现选择排序算法的递归版本,步骤如下: 步骤1:找到最小值 首先,在要排序的数组中找到最小值,这个过程可以用for循环来实现。具体实现如下: // 找到数组中最小值的下标 int findMinIndex(int arr[], int startIndex, int endIndex) { int minIndex = startIndex; for (in…

    算法与数据结构 2023年5月19日
    00
  • python KNN算法实现鸢尾花数据集分类

    Python实现KNN算法对鸢尾花数据集进行分类 介绍 KNN(K-Nearest-Neighbor)算法是一种非常常用且简单的分类算法之一。它的基本思想是把未知数据的标签与训练集中最邻近的K个数据的标签相比较,得票最多的标签就是未知数据的标签。本文将介绍如何使用Python实现对鸢尾花数据集进行KNN分类。 步骤 加载数据 首先,我们需要加载鸢尾花数据集。…

    算法与数据结构 2023年5月19日
    00
  • C++使用一个栈实现另一个栈的排序算法示例

    C++使用一个栈实现另一个栈的排序算法 本文将介绍如何使用一个栈(以下称为stack1)将另一个未排序的栈(以下称为stack2)进行排序,排序结果存放在stack2中。 实现思路 我们可以通过stack1不断从stack2中弹出元素,将弹出的元素插入到正确的位置,实现栈的排序。 具体步骤如下: 创建一个临时变量temp,用于存储stack1中弹出的元素。 …

    算法与数据结构 2023年5月19日
    00
  • C#中使用快速排序按文件创建时间将文件排序的源码

    下面就来详细讲解如何在C#中使用快速排序按文件创建时间将文件排序的源码攻略。 1. 快速排序原理 快速排序(Quick Sort)是一种基于分治法的高效排序算法,其主要思想是选择一个基准点(pivot),将数组分为左右两个子数组,将左边的数组的元素都小于基准点,右边的数组的元素都大于基准点,再递归对左右子数组进行快排操作,直到子数组长度为1或0。快速排序的时…

    算法与数据结构 2023年5月19日
    00
  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

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