これが私が書いた 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 ops
内側のループ (比較と割り当て): 2 つの ops が 2n^2 回実行される = 2n² ops
配列要素の比較 (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
Big Oh(n²) につながる
それは正しいように見えますか?特に内側のループとその中のものに関しては...