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) в качестве ответа. Это домашнее задание, но часть Big O - это просто мой способ учебы.
Спасибо еще раз
Изменить: я получаю N из первого цикла for и количество проходов N-1-X в if, и я не уверен, как это обозначить, так как он ограничивает количество проходов, я назвал его 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;
}
Итак, поскольку максимальное количество времени, в течение которого Swap вызывается для цикла for, равно 2, это означает, что его O (2N), но константы не имеют значения, поэтому его O (N) правильно?
O(N-squared)
- person selbie   schedule 01.11.2015O(N)
, а в худшем - довольно близко кO(N^2)
, но на самом деле это будет быстрее. При ближайшем рассмотрении это выглядит как оптимизированная сортировка пузырьков - person smac89   schedule 01.11.2015