SelectionSort的复杂性分析

时间:2012-05-02 17:09:09

标签: algorithm complexity-theory

这是我写的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 Loop(比较和分配):2次操作执行n次= 2n ops

分配maxPos:n ops

内环(比较和分配):2个操作执行2n ^ 2次=2n²操作

数组元素的比较(2个数组引用和比较):3n²ops

分配新的maxPos:n²ops

数组元素的比较(2个数组引用和比较):3n²ops

作业&amp;数组引用:2n²ops

作业&amp; 2个数组引用:3n²ops

作业&amp;数组引用:2n²ops

基本操作总数

2n + n +2n²+3n²+ n ^ 2 +3n²+2n²+3n²+2n²=16n²+ 3n

通向Big Oh(n²)

这看起来是否正确?特别是当它涉及内环和内部的东西时......

2 个答案:

答案 0 :(得分:2)

是的,O(N 2 )是正确的。

编辑:就“从第一原则”而言,很难猜到他们可能想要什么,但我猜他们正在寻找(实质上)某些东西证明(或至少表示)满足big-O的基本定义的顺序:

  

存在正常数 c n 0 ,以便:

     对于所有n≥n 0

0≤f(n)≤cg(n)。

因此,找到16N 2 + 3N后的下一步是找到n 0 和c的正确值。至少乍看之下,c似乎是16,而n 0 ,-3,(可能被视为0,负数没有实际意义)。

答案 1 :(得分:1)

通常,添加实际操作是毫无意义的(并且不正确),因为操作需要不同数量的处理器周期,其中一些是从内存中取消引用值,这需要花费更多时间,然后由于编译器优化代码而变得更加复杂,那么你有缓存局部性等等,所以除非你知道真的,非常好一切如何在下面工作,你要加上苹果和橘子。你不能只把“j&lt; i”,“j ++”和“numbers [i] = numbers [maxPos]”加起来好像它们是相同的,而你不需要这样做 - 为了复杂度分析,恒定时间块是一个恒定的时间块。您没有进行低级代码优化。

复杂性确实是N ^ 2,但你的系数毫无意义。