我非常肯定我的答案,但今天与我的朋友讨论说我错了。
我认为这个函数的复杂度在平均和最差情况下是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非常相似。无论如何,我添加了家庭作业标签。
请帮我确认一下我是否对。谢谢你的帮助。
答案 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)
,外部while
从k
下降到1(可能在某些特定数据中提前停止,但我们在这里说的是最糟糕的情况)和内部{{ 1}}从0变为for
(反过来又升至i
),因此在最坏的情况下乘以k
。
如果你关心最好的情况,那就是k^2
因为外部O(n)
循环只执行一次然后被中止。