Nu bogobogosort 
 Modul în care v-ați implementat bogobogosort, este de fapt mai rapid decât bogosort becau câteva motive: 
- 
 După ce ați bogosort cu succes kelemente, verificați imediat dacăk+1elementele sunt sortate. Aceasta înseamnă că, dacă într-un amestec anterior, vi s-a întâmplat să amestecațimelementele toate în ordine, atunci după ce sortați primele două elemente, veți ajunge imediat lam.
  De exemplu, să presupunem că atingi 5 cărți și apoi eșuezi. Amestecați 5 cărți și apoi începeți de la 2. Dacă aceste 5 cărți se întâmplă să fie în ordine sortată, veți ajunge imediat la 6 imediat ce puneți primele 2 cărți în ordine.  
- 
 Din cauza punctului # 1, bogobogosortul dvs. este de fapt mai rapid decât bogosortul, deoarece trebuie doar să sorteze cardurile n-1în loc den. După ce sortează cardurilen-1, verifică ordinea cardurilornși poate eșua. Dar, în caz de eșec, remodeleazăncărțile astfel încât de fiecare dată când sorteazăn-1cărțile să aibă un1/nșansa de a reuși în cele din urmă. Deci, numărul total de cărți amestecate este de ordinea(n-1) * (n-1)! * n, care se simplifică la(n-1) * n!, comparativ cu bogosortul care amestecă .
  Cred că același principiu se aplică la fiecare pas, deci timpul este chiar mai mic decât (n-1) * n!. Nu sunt sigur de matematica exactă, dar din rularea programului dvs. se pare că bogobogosort rulează aproximativ în același timp cu bogosort cu încă câteva cărți. Adică Your_bogobogosort (n) = bogosort (n-1).
 
 Un bogobogosort adecvat 
 Am rescris funcția bogobogosort astfel încât să fie astfel: 
unsigned long bogobogosort(int *data, size_t n) { unsigned long c = 0; size_t b = 2; while (1) { if (sorted(data, b)) { if (b == n) break; b++; } else { b = 2; } c += b; shuffle(data, b); } return c; } 
 Diferența esențială aici este că, după fiecare succes în care crește b, remodelează pachetul pentru a împiedica punctul # 1 de mai sus să se întâmple .. Cu această modificare, obțin rezultate astfel: 
% ./a.out 6 bogosort shuffled 1044 cards in 0.000013 seconds. bogobogosort shuffled 54464568 cards in 0.500339 seconds. 
 Comentarii