这是我写的一个selectionsort例程。我的复杂性分析是正确的吗?
public static void selectionSort(int[] numbers) {
// Iterate over each cell starting from the last one and working backwards
for (int i = numbers.length - 1; i >=1; i--)
{
// Always set the max pos to 0 at the start of each iteration
int maxPos = 0;
// Start at cell 1 and iterate up to the second last cell
for (int j = 1; j < i; j++)
{
// If the number in the current cell is larger than the one in maxPos,
// set a new maxPos
if (numbers[j] > numbers[maxPos])
{
maxPos = j;
}
}
// We now have the position of the maximum number. If the maximum number is greater
// than the number in the current cell swap them
if (numbers[maxPos] > numbers[i])
{
int temp = numbers[i];
numbers[i] = numbers[maxPos];
numbers[maxPos] = temp;
}
}
}
复杂性分析
outter循环(比较和分配):执行2个操作n次=2n个操作
分配maxpos:n ops
内环(比较和分配):执行2次操作2n^2次=2次操作
数组元素比较(2个数组引用和比较):3n?ops
分配新的maxpos:n?ops
数组元素比较(2个数组引用和比较):3n?ops
分配和数组引用:2n?ops
分配和2个数组引用:3n?ops
分配和数组引用:2n?ops
原语操作总数
2N+N+2N榍+3N榍+N^2+3N榍+2N榍+3N榍+2N榍=16N榍+3N
导致大oh(n m2)
看起来对吗?尤其是当涉及到内部循环和内部的东西时…
最佳答案
是的,O(N2)是正确的。
编辑:就“第一原则”而言,很难准确猜测他们到底想要什么,但我猜他们(本质上)是在寻找符合Big-O基本定义的证据(或至少是迹象):
存在正常数C和N0,使得:
对于所有n≥n0,0≤f(n)≤cg(n)。
因此,在找到16n2+3n之后的下一步是找到n0和c的正确值。至少乍一看,c似乎是16,n0,-3(这可能被视为0,没有实际意义的元素的负数)。
关于algorithm - SelectionSort的复杂度分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10418474/