这是我写的一个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/

10-10 22:52