这是我写的一个 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;
}
}
}
复杂性分析
外循环(比较和分配):2 次操作执行 n 次 = 2n 次操作
分配 maxPos:n 个操作
内循环(比较和分配):2 次操作执行 2n^2 次 = 2n² 次操作
数组元素的比较(2 个数组引用和一个比较):3n² 操作
分配新的 maxPos: n² ops
数组元素的比较(2 个数组引用和一个比较):3n² 操作
赋值和数组引用:2n² 操作
赋值和 2 个数组引用:3n² 操作
赋值和数组引用:2n² 操作
原始操作总数
2n + n + 2n² + 3n² + n^2 + 3n² + 2n² + 3n² + 2n² = 16n² + 3n
通向大哦(n²)
这看起来正确吗?特别是当涉及到内部循环和里面的东西时......