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)是对的吗?
答案 0 :(得分:4)
假设PlayerB
的每个元素都会导致“丢失”。对于第一个元素,执行Length-1交换。对于第二个元素,执行Length-2交换。对于第三个元素,执行Length-3交换。等
(sum(1..n)和sum(1 ..(n-1))之间的差异不会影响big-O。)