不确定我的大O分析

时间:2015-11-01 05:59:56

标签: c big-o

int RiskSort(int* PlayerA, int* PlayerB,int Length){
    int i,j;
    int Losses = 0;
    for(i=0;i<Length-Losses;i++){
         printf("%d,%d\n",PlayerA[i],PlayerB[i]);
        if(PlayerB[i]<PlayerA[i]){
                for(j=i;j<((Length-1)-Losses);j++){
                    Swap(&PlayerB[j],&PlayerB[j+1]);
                }
                i--;
                Losses++;
        }

    }
return Losses;

}

我刚刚写了这个,我得到O(n log n)作为我的答案,这是作业,但是大O部分只是我的学习方式。

再次感谢

编辑:我从第一个for循环获得N和在if上传递N-1-X数量,我不确定如何记录,因为它限制了传递量我称之为log n(可能不准确,但我找不到一个没有查看代码并在线选择的指南)

编辑2:试图让这个功能更有效率

int RiskSortB(int* PlayerA, int* PlayerB,int Length){
int i,j;
int Losses = 0;
for(i=0;i<Length-Losses;i++){
j=i+1;
if(PlayerB[i]<PlayerA[i])
    Losses++;

while(PlayerB[i]<PlayerA[i]&&j<Length){
    if(PlayerB[j]>=PlayerA[i]){
        Swap(&PlayerB[i],&PlayerB[j]);
        if(j!=(Length-Losses))
            Swap(&PlayerB[j],&PlayerB[Length-Losses]);
    }
    j++;
}


}

return Losses;
}

因此,对于每个for循环调用最大Swap的时间量是2,这意味着它的O(2N)但是常数无关紧要,所以它的O(N)是对的吗?

1 个答案:

答案 0 :(得分:4)

假设PlayerB的每个元素都会导致“丢失”。对于第一个元素,执行Length-1交换。对于第二个元素,执行Length-2交换。对于第三个元素,执行Length-3交换。等

总共有多少掉期?多达1 + 2 + ... +(n-1)。当你看到这个整数队列时,应用高斯公式:整数之和1..n = n *(n + 1)/ 2 =(n 2 + n)/那就是O(n 2 )。

(sum(1..n)和sum(1 ..(n-1))之间的差异不会影响big-O。)