【问题标题】:Can InsertionSort complexity be brought down to O(nlogn)?插入排序的复杂度可以降低到 O(log n) 吗?
【发布时间】:2023-03-30 17:56:01
【问题描述】:

我想知道通过在 java 中使用 BinarySearch 和 ArrayLists 是否可以将 InsertionSOrt 的复杂性从 O(n2) 降低到 O(nlogn)。

【问题讨论】:

  • 你认为二分查找会如何改进插入排序? ArrayLists 将如何提供帮助?
  • 是否有一些标准的 Java 类称为 InsertionSortBinarySearch 我不知道?
  • 没有。最好情况的复杂度为 O(n)。这种情况适用于已经排序的数组。二进制搜索没有帮助。

标签: java sorting complexity-theory insertion-sort


【解决方案1】:

在插入排序中,有两件事会导致 O(n2) 复杂度:

1) 搜索要替换的元素的适当位置 - 每次迭代 O(n)。使用二分搜索可以将其简化为 O(log n)。

2) 一旦找到正确的位置,然后将大于(或小于)该元素的元素向右移动。在最坏的情况下,您将在列表的前面插入一个元素,这将需要将排序列表中的所有剩余元素向右移动 - 最坏的情况是每次迭代 O(n)。

所以使用 Binary Search 和 ArrayList 的总复杂度将是:

O(n * n + n * log n)

【讨论】:

    【解决方案2】:

    插入排序的复杂度是:

    1. 遍历要排序的所有剩余元素。 (n 个元素的 O(n))
    2. 一个。如果下一个元素(例如在位置 k 处)大于在 pos k-1 处的元素,则什么也不做(检查为 O(1) )。即 O(n * 1) 是所有元素都已排序的最佳情况。

      b.如果 pos k 处的元素小于 k-1 处的元素,则将元素向左移动,直到它大于其左侧的元素,或者没有剩余的元素可供比较。 .所以 O(n*n)

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 2021-03-29
      • 1970-01-01
      • 2011-07-09
      • 2022-10-08
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多