📜  Java堆排序程序(1)

📅  最后修改于: 2023-12-03 14:43:00.311000             🧑  作者: Mango

Java堆排序程序

堆排序(Heap Sort)是一种基于完全二叉树的排序算法,它的时间复杂度为O(nlogn)。

在Java中,我们可以使用优先队列(PriorityQueue)实现堆排序,因为PriorityQueue是堆的一个实现。

算法流程
  1. 构建一个最大堆(Max Heap)或最小堆(Min Heap)。
  2. 将堆顶元素(最大元素或最小元素)与堆底元素进行交换,然后删除堆底元素(即最后一个元素)。此时,根节点不符合最大堆或最小堆的性质,需要进行调整,使之重新成为最大堆或最小堆。
  3. 重复步骤2,直到堆仅剩下一个元素为止。
代码实现

下面是使用PriorityQueue实现堆排序的Java代码:

public static void heapSort(int[] arr) {
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    // 把数组元素添加到堆中
    for (int num : arr) {
        heap.offer(num);
    }
    // 依次取出堆顶元素
    int index = 0;
    while (!heap.isEmpty()) {
        arr[index++] = heap.poll();
    }
}

这里我们创建了一个PriorityQueue对象,把数组中的元素逐个添加到堆中。然后通过调用PriorityQueue的poll()方法逐个取出堆顶元素(最小元素),再把堆顶元素依次放回原数组中。

性能分析

堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。相比于快速排序而言,堆排序更适用于数据量比较大,每个元素都比较重要的场合。堆排序虽然具有一定的局限性,但在大规模数据排序时仍是一个非常好的选择。