欢迎访问宙启技术站
智能推送

Java函数实现堆排序算法的例子

发布时间:2023-06-14 15:15:56

在计算机科学中,堆排序是一种排序算法,它利用堆的数据结构来进行排序。堆是一个特殊的数据结构,它可以用一棵完全二叉树来表示。

堆有两种形式,最大堆和最小堆。在最大堆中,父节点比它的子节点大;在最小堆中,父节点比它的子节点小。因为根据堆的定义,堆顶一定是最大值或最小值,所以在堆排序中,我们将数据按照从小到大的顺序排列,使用最大堆。

堆排序算法步骤如下:

1.建立最大堆:从最后一个非叶子节点开始进行调整,将其和下面最大的子节点交换位置。然后递归调整之前的位置,使其满足最大堆的性质。

2.排序:将堆顶元素与最后一个元素交换位置,然后再次进行最大堆调整。

3.重复步骤2,直到所有元素排好序。

Java实现堆排序算法

以下是Java实现堆排序算法的例子。

import java.util.Arrays;

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};

        System.out.println("排序前:");

        System.out.println(Arrays.toString(arr));

        HeapSort ob = new HeapSort();

        ob.sort(arr);

        System.out.println("排序后:");

        System.out.println(Arrays.toString(arr));

    }

}

输出:

排序前:

[12, 11, 13, 5, 6, 7]

排序后:

[5, 6, 7, 11, 12, 13]

以上就是Java实现堆排序算法的例子,通过代码的实现我们可以更加深入地理解堆排序算法的流程和实现。