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

如何实现堆排序算法并进行java函数编写?

发布时间:2023-07-06 04:42:10

堆排序是一种基于完全二叉树的排序算法。它的基本思想是将待排序的序列构造成一个大顶堆或小顶堆,然后依次将堆顶元素与最后一个元素交换位置,再对剩余的元素重新构造堆,如此循环直到整个序列有序。

下面是实现堆排序的Java函数编写步骤:

1. 构建大顶堆:首先需要定义一个函数 buildMaxHeap,用于将待排序序列构造成大顶堆。大顶堆的特点是父节点的值大于等于其左右子节点的值。构建大顶堆的思路是从最后一个非叶子节点开始,依次向上调整节点,保证每个节点满足大顶堆的特点。具体实现可以使用递归或迭代的方式。

2. 堆排序:定义一个函数 heapSort,用于实现堆排序算法。首先调用 buildMaxHeap 函数将待排序序列构建成大顶堆。然后通过循环,每次将堆顶元素与最后一个元素交换位置,并调用 buildMaxHeap 函数重新构建大顶堆。循环结束后,整个序列就是有序的。

下面是完整的Java代码实现:

public class HeapSort {

    public static void heapSort(int[] array) {
        // 构建大顶堆
        buildMaxHeap(array);

        // 循环将堆顶元素与末尾元素交换位置,然后重新构建大顶堆
        for (int i = array.length - 1; i > 0; i--) {
            int temp = array[0];
            array[0] = array[i];
            array[i] = temp;
            maxHeapify(array, 0, i);
        }
    }

    private static void buildMaxHeap(int[] array) {
        // 从最后一个非叶子节点开始,依次向上调整节点
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            maxHeapify(array, i, array.length);
        }
    }

    private static void maxHeapify(int[] array, int i, int length) {
        int leftChild = 2 * i + 1; // 左子节点的位置
        int rightChild = 2 * i + 2; // 右子节点的位置
        int largest = i;

        // 找到三个节点中最大的节点
        if (leftChild < length && array[leftChild] > array[largest]) {
            largest = leftChild;
        }
        if (rightChild < length && array[rightChild] > array[largest]) {
            largest = rightChild;
        }

        // 如果最大节点不是当前节点,则将最大节点与当前节点交换位置,并递归调整交换后的节点
        if (largest != i) {
            int temp = array[i];
            array[i] = array[largest];
            array[largest] = temp;
            maxHeapify(array, largest, length);
        }
    }

    public static void main(String[] args) {
        int[] array = {9, 2, 7, 1, 5, 8, 3, 6, 4};

        System.out.println("排序前:");
        for (int num : array) {
            System.out.print(num + " ");
        }

        heapSort(array);

        System.out.println("
排序后:");
        for (int num : array) {
            System.out.print(num + " ");
        }
    }
}

执行上述代码,输出结果如下:

排序前:
9 2 7 1 5 8 3 6 4 
排序后:
1 2 3 4 5 6 7 8 9

以上就是实现堆排序算法的Java函数编写。堆排序的时间复杂度为 O(nlogn),是一种高效的排序算法。