【发布时间】:2015-11-01 05:59:56
【问题描述】:
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) 对吗?
【问题讨论】:
-
为什么你认为它是 O(n log n)?编辑您的问题以解释您的推理。
-
嵌套的 for 循环通常但不总是表示
O(N-squared) -
有没有办法确定它是否为 O(N^2)?
-
随便一瞥,最好的情况是
O(N),最坏的情况是很接近O(N^2),但实际上它会比这更快。仔细观察,它看起来像是优化的冒泡排序