21xrx.com
2024-09-17 03:59:51 Tuesday
登录
文章检索 我的文章 写文章
Java堆排序的时间复杂度分析及实例
2023-06-13 10:12:00 深夜i     --     --
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)。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复