【问题标题】:Why selection best case is not O(n)为什么选择最佳情况不是 O(n)
【发布时间】:2020-12-05 02:30:52
【问题描述】:

我读过很多主题,人们通常说选择排序在最佳情况下的复杂度仍然是 O(n^2)。但我不能被这些想法说服。 例如,我想按 升序 顺序对数组进行排序。这是我在 Java 代码中的算法:

void selectionSort(int[] arr) {
    int min, temp;
    int length = arr.length;
    for (int i = 0; i <= length - 1; i++) {
        //System.out.println(i);
        min = i;
        for (int j = i+1; j < length ; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        if (min != i) {
            temp = arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
        } else {
            break;
        }
    }
}

我相信在最好的情况下这是 O(n),即输入数组已经排序。 我在算法中添加的另一件事是检查 if (min == i) 并打破循环。 你怎么看?我错了吗?

【问题讨论】:

  • 是的,这是 O(n) 时间的最佳情况,但此代码 不是 选择排序(或任何排序),因为它一旦找到位于正确的位置。例如 [0, 2, 1] 排序不正确。
  • 你的例子很清楚。现在我明白了!

标签: algorithm sorting time-complexity selection-sort


【解决方案1】:

SelectionSort 显然具有 O(N²) 时间复杂度,因为必须完整执行循环。比较次数在所有情况下都是三角数 T(N-1),而交换次数是线性的(在标准版本中)。

避免对已经存在的元素进行交换可能是一个坏主意,因为它在非常低的概率下有效并且在大多数情况下执行无效。 (不算中断...破坏了算法。)

【讨论】:

    【解决方案2】:

    选择排序中的两个循环都将完全运行 n 次。让我们以[1,2,3,4,5]为例

    对于数组的每个值,外循环将运行 5 次。然后内部循环将检查这是否是数组其余部分的最小值。

    outer value = 1   -> Inner value 2,3,4,5
    outer value = 2   -> Inner value 3,4,5
    outer value = 3   -> Inner value 4,5
    outer value = 4   -> Inner value 5
    outer value = 5   -> Inner value none
    

    另外,在您的代码中,此检查不正确

     else {
                break;
          }
    

    说数组是[1,3,2]。在第一个外循环中,min ==i,它会中断,甚至不会移动到下一个值。

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 2021-06-12
      • 2017-05-08
      • 1970-01-01
      • 2020-06-20
      • 2012-09-12
      • 1970-01-01
      • 2011-11-13
      • 2017-09-28
      相关资源
      最近更新 更多