【问题标题】:Time complexity of this function该函数的时间复杂度
【发布时间】:2011-11-11 14:56:35
【问题描述】:

我很确定我的答案,但今天和我的朋友讨论过,他说我错了。

我认为这个函数的复杂度在平均和最坏情况下是 O(n^2),在最好情况下是 O(n)。对吧?

现在当 k 不是数组长度时会发生什么? k 是要排序的元素数(而不是整个数组)。

最好和最坏的情况是 O(nk),最好的情况是 O(n)?

这是我的代码:

#include <stdio.h>

void bubblesort(int *arr, int k)
{
    // k is the number of item of array you want to sort
    // e.g. arr[] = { 4,15,7,1,19} with k as 3 will give
    // {4,7,15,1,19} , only first k elements are sorted
  int i=k, j=0;
  char test=1;
  while (i && test)
  {
    test = 0;
    --i;
    for (j=0 ; j<i; ++j)
    {
      if ((arr[j]) > (arr[j+1]))
      {
          // swap 
          int temp = arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        test=1;
      }

    }  // end for loop

  } // end while loop
}

int main()
{

    int i =0;
    int arr[] = { 89,11,15,13,12,10,55};
    int n = sizeof(arr)/sizeof(arr[0]);

    bubblesort(arr,n-3);
    for (i=0;i<n;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

附:这不是作业,只是看起来像一个。我们讨论的函数与冒泡排序非常相似。无论如何,我已经添加了作业标签。

请帮助我确认我是否正确。感谢您的帮助。

【问题讨论】:

  • O(n2) 和 O(n) 是一回事,通常会忽略任何常数因素...另外,您是否看过维基百科关于冒泡排序的文章?
  • 我很确定他的意思是 O(n^2),而不是 O(2n)
  • @PlassmaHH ,对不起,你的意思是 O(n^2) 和 O(nk) 是一回事吗?
  • @Kevin,哦,现在我明白是什么造成了混乱。我会编辑那个。谢谢,是的,我就是这个意思

标签: c algorithm time-complexity


【解决方案1】:

复杂度通常作为 n(或 N)上的函数给出,例如 O(n)、O(n*n)、...

关于您的代码,复杂性如您所述。最好的情况是 O(n),最坏的情况是 O(n*n)。

在您的情况下可能导致误解的是您有一个变量 n(数组的长度)和一个变量 k(数组中要排序的部分的长度)。当然,排序的复杂性不取决于数组的长度,而是取决于要排序的部分的长度。因此,对于您的变量,复杂性是 O(k) 或 O(k*k)。但由于通常复杂性符号超过 n,你会说 O(n) 或 O(n*n) 其中 n 是要排序的部分的长度。

【讨论】:

    【解决方案2】:

    最好和最坏的情况是 O(nk),最好的情况是 O(n)?

    不,这是 O(k^2) 最坏情况和 O(k) 最好情况。对大小为n 的数组的第一个k 元素进行排序与​​对k 元素的数组进行排序完全相同。

    【讨论】:

    • 谢谢。明白了,我到底在想什么?
    【解决方案3】:

    那是O(n^2),外部whilek 下降到1(可能更早停止特定数据,但我们在这里讨论最坏的情况),内部for 从0 变为@ 987654325@(反过来又上升到k),所以乘以它们在最坏的情况下是k^2

    如果您关心最好的情况,那就是 O(n),因为外部 while 循环只执行一次然后中止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2015-12-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      相关资源
      最近更新 更多