这个功能的时间复杂性

时间:2011-11-11 14:56:35

标签: c algorithm time-complexity

我非常肯定我的答案,但今天与我的朋友讨论说我错了。

我认为这个函数的复杂度在平均和最差情况下是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;
}

P.S。这不是功课,只是看起来像一个。我们讨论的功能与Bubble sort非常相似。无论如何,我添加了家庭作业标签。

请帮我确认一下我是否对。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

  

O(nk)是最佳和最差情况,O(n)是最佳情况吗?

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

答案 1 :(得分:2)

复杂性通常作为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 :(得分:1)

那是O(n^2),外部whilek下降到1(可能在某些特定数据中提前停止,但我们在这里说的是最糟糕的情况)和内部{{ 1}}从0变为for(反过来又升至i),因此在最坏的情况下乘以k

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