legongju.com
我们一直在努力
2025-01-10 21:42 | 星期五

java堆排序如何实现

Java堆排序(Heap Sort)是一种基于二叉堆(Binary Heap)的比较类排序算法。二叉堆可以分为最大堆(Max Heap)和最小堆(Min Heap)。这里我将为您介绍如何使用最大堆实现堆排序。

以下是使用Java实现堆排序的步骤:

  1. 构建最大堆:将给定的无序数组转换为最大堆。
  2. 堆排序:重复从堆中提取最大元素并将其放到数组的末尾,然后调整堆结构。

下面是Java代码实现:

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

    public static void heapSort(int[] arr) {
        int n = arr.length;

        // Build max heap
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // Extract elements one by one
        for (int i = n - 1; i > 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // Call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }

    public static void heapify(int[] arr, int n, int i) {
        int largest = i; // Initialize largest as root
        int left = 2 * i + 1; // Left = 2*i + 1
        int right = 2 * i + 2; // Right = 2*i + 2

        // If left child is larger than root
        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }

        // If right child is larger than largest so far
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }

        // If largest is not root
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }
}

这段代码首先定义了一个heapSort方法,用于对输入数组进行堆排序。在heapSort方法中,我们首先构建最大堆,然后通过循环提取最大元素并将其放到数组的末尾。最后,我们定义了一个heapify方法,用于调整堆结构。

当运行此代码时,您将看到已排序的数组输出:

Sorted array is:
5 6 7 11 12 13

未经允许不得转载 » 本文链接:https://www.legongju.com/article/42744.html

相关推荐

  • foreach遍历时修改集合元素可行吗

    foreach遍历时修改集合元素可行吗

    在某些编程语言中,使用foreach遍历集合并修改集合元素是可行的。但是,这种做法可能会导致一些问题,例如在遍历过程中修改集合大小,从而导致意外的行为或错误。...

  • 如何避免java foreach中的空指针异常

    如何避免java foreach中的空指针异常

    要避免在Java的foreach循环中出现空指针异常(NullPointerException),你可以在访问集合元素之前检查它们是否为null。这里有一些建议: 在进入foreach循环之前,...

  • foreach在并发编程中的应用场景

    foreach在并发编程中的应用场景

    foreach 是一个常见的循环结构,用于遍历集合(如数组、列表等)中的每个元素。在并发编程中,foreach 可以用于执行多个任务,这些任务可以并行运行以提高程序的...

  • java foreach与普通for循环效率对比

    java foreach与普通for循环效率对比

    在Java中,foreach循环和普通for循环在性能上的差异通常可以忽略不计。实际上,它们在底层都是通过迭代器或索引来访问集合元素的。然而,在某些情况下,foreach循...

  • java如何实现双向认证

    java如何实现双向认证

    在Java中实现双向认证,通常涉及到两个实体之间的相互认证。一个常见的场景是客户端和服务器之间的安全通信。以下是一个简单的示例,展示了如何使用Java实现双向...

  • java如何实现迭代器

    java如何实现迭代器

    在Java中,迭代器(Iterator)是一种设计模式,用于遍历集合(Collection)中的元素。要实现一个迭代器,你需要遵循以下步骤: 创建一个实现了Iterator接口的类。...

  • java怎样输入一个数

    java怎样输入一个数

    在Java中,你可以使用Scanner类从用户那里获取输入。以下是一个简单的示例,演示了如何输入一个整数并将其存储在一个变量中:
    import java.util.Scanner; p...

  • java中常见的五种异常是什么

    java中常见的五种异常是什么

    Java中有许多不同类型的异常,但五种常见的异常如下: NullPointerException(空指针异常):当应用程序试图访问一个空对象的属性或方法时,会抛出此异常。这通常...