我对我的答案很肯定,但今天我和朋友讨论说我错了。
我认为这个函数的复杂度是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;
}

这不是作业,只是看起来像作业我们讨论的函数非常类似于气泡排序。无论如何,我已经添加了家庭作业标签。
请帮我确认一下我是否正确。谢谢你的帮助。

最佳答案

复杂性通常是作为函数在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是要排序的部分的长度。

07-25 22:34
查看更多