有人可以在我的示例中向我解释计算big-O的逻辑吗

时间:2019-02-12 14:47:28

标签: c# algorithm sorting time-complexity big-o

据说选择排序的复杂度为O(N ^ 2),但是由于我减少了循环执行的次数,所以我没有逻辑。我了解代码块2,但不了解代码块1

public int[] Sorting(int[] array)
{
    for (i = 0; i <= array.Length - 1; i++)
    {           
        minimum=i;
        for (j = i; j < array.Length-1; j++) 
        {
            if (array[minimum] > array[j+1])
                minimum = j + 1;
        }   
        int temp = array[minimum];
        array[minimum] = array[i];
        array[i] = temp;
    }

    return array;
}

for(i=0;i<=n;i++) //Code 2
{
    for(j=0;j<=n;j++)

1 个答案:

答案 0 :(得分:5)

n为数组大小。

然后查看比较次数(调用if (array[minimum] > array[j+1]))。

  • 对于 i = 0 ,它被称为 n-1 次。
  • 对于 i = 1 ,它被称为 n-2 次。
  • ...
  • 对于 i = n-1 ,它被称为 0 次。

最后,它被称为0 + 1 + ... +(n-1)次。

sum of consecutive integers

根据您的情况,它是(n-1)*n/2,即O(n²)

修改

因此,比较的确切次数是(n-1)*n/2,不是确切的,看起来比好,但实际上不是。

  • 对于n = 10,您有45个比较。
  • 对于n = 100,您有4950个比较。

如果要输入10倍以上,则需要花费100倍以上的时间来完成算法。

  • 对于n = 10,您有45个比较。
  • 对于n = 1000,您有499500个比较。

对于100倍以上的输入,您要完成10倍以上的时间才能完成算法。

如您所见,当您将条目数乘以 k 时,您将大致乘以计算时间。