堆排序(Heap Sort)算法及其在Java中的实现

堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法,它的基本思想是将待排序的序列构造成一个大顶堆或小顶堆,然后逐步将根节点与最后一个节点交换并重新调整堆,直到整个序列有序为止。堆排序具有稳定性和高效性的特点,时间复杂度为O(nlogn)。

堆的数据结构

在堆排序算法中,我们通常使用完全二叉树来表示堆,其中父节点的值大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。

classDiagram
  class Heap {
    -int[] heapArray
    -int heapSize
    +void heapSort(int[] arr)
    +void buildHeap()
    +void heapify(int i)
    +void swap(int i, int j)
  }

堆排序算法步骤

  1. 构建堆:将待排序序列构建成一个大顶堆或小顶堆。
  2. 调整堆:将根节点与最后一个节点交换,然后重新调整堆使其满足堆的性质。
  3. 重复2:重复第2步,直到整个序列有序。

Java实现

下面是使用Java语言实现堆排序算法的示例代码:

public class Heap {
    private int[] heapArray;
    private int heapSize;

    public void heapSort(int[] arr) {
        heapArray = arr;
        heapSize = heapArray.length;
        buildHeap();

        for (int i = heapSize - 1; i >= 0; i--) {
            swap(0, i);
            heapSize--;
            heapify(0);
        }
    }

    private void buildHeap() {
        for (int i = heapSize / 2 - 1; i >= 0; i--) {
            heapify(i);
        }
    }

    private void heapify(int i) {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        if (left < heapSize && heapArray[left] > heapArray[largest]) {
            largest = left;
        }

        if (right < heapSize && heapArray[right] > heapArray[largest]) {
            largest = right;
        }

        if (largest != i) {
            swap(i, largest);
            heapify(largest);
        }
    }

    private void swap(int i, int j) {
        int temp = heapArray[i];
        heapArray[i] = heapArray[j];
        heapArray[j] = temp;
    }
}

示例

假设我们有一个待排序的数组:[4, 2, 7, 1, 5, 3]

使用堆排序算法对其进行排序:

public class Main {
    public static void main(String[] args) {
        int[] arr = {4, 2, 7, 1, 5, 3};
        Heap heap = new Heap();
        heap.heapSort(arr);

        System.out.println("Sorted array:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

输出结果为:1 2 3 4 5 7

总结

堆排序算法是一种高效的排序算法,其时间复杂度为O(nlogn)。通过构建堆并逐步调整堆的过程,我们可以将一个无序序列排序成有序序列。在Java中,我们可以通过实现堆排序算法来实现这一过程。希望本文能帮助你理解堆排序算法及其在Java中的应用。