21xrx.com
2025-03-31 03:59:01 Monday
文章检索 我的文章 写文章
Java堆排序的时间复杂度分析及实例
2023-06-13 10:12:00 深夜i     18     0
Java堆排序 时间复杂度 最大堆

Java中的堆排序是一种高效的排序算法,时间复杂度为O(n log n)。堆排序利用了堆的性质,通过构建最大堆或最小堆来实现排序。

以下是Java实现堆排序的代码案例:

public static void heapSort(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);
  }
}
public static 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;
  // 如果最大元素不是父节点,则交换父节点和最大元素,并递归调用heapify
  if (largest != i) {
    int swap = arr[i];
    arr[i] = arr[largest];
    arr[largest] = swap;
    heapify(arr, n, largest);
  }
}

该堆排序的时间复杂度为O(n log n)。其中,最大堆的构建时间复杂度为O(n),而每次取出最大元素和重新调整堆的时间复杂度为O(log n)。

  
  

评论区