Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2011-01-11, 15:59
  #1
Medlem
bornfree1985s avatar
Tja. Hur sortera ett antal bollar, vita o svarta, så att alla vita bollar kommer till vänster?
Algoritmen ska vara inplace, dvs man får inte använda en extra array.
Den ska vara O(n).

Något snille som vet?
Citera
2011-01-11, 16:04
  #2
Medlem
Initialisera två räknare v och s till noll. v räknar antalet vita bollar flyttade, s antalet svarta.

Låt i gå igenom positionerna i array:n från vänster till höger.

För varje i: Kolla om i:te bollen är svart eller vit. Om vit, byt plats på den bollen och den (v+1):te bollen från vänster och öka v med ett. Om den är svart, byt plats på den bollen och den (s+1):te bollen från höger och öka s med ett.

På så sätt skjuts alla vita bollar till vänster och alla svarta till höger.
Citera
2011-01-11, 16:12
  #3
Medlem
bornfree1985s avatar
tack kompis
Citera
2011-01-11, 18:19
  #4
Avstängd
fysikmotors avatar
Låt en pekare v:vänster peka på första elementet och en pekare h:höger peka på sista elementet.

Låt v flytta ett steg till höger tills dess att den stöter på en svart boll. Låt h flytta ett steg till vänster tills dess att den stöter på en vit boll. Invertera då de båda elementen; dvs vit blir svart, och tvärt om.

Kontrollera om båda pekarna, v och h pekar på samma element vid varje flytt av v eller h; om så är fallet så är sorteringen färdig.
Citera
2011-01-12, 16:23
  #5
Medlem
bornfree1985s avatar
Om det är tre olika färger då? Svart, vit röd, och de ska ligga i den ordningen? Fortfarande är O(n) max antal operationer
Citera
2011-01-12, 16:26
  #6
Medlem
En metod (men den är two-pass) är ju att först gå igenom hela array:n en gång och räkna antalet svarta, vita och röda kulor, och sen gå igenom array:n igen och swappa in allting på rätt plats direkt.
Citera
2011-01-12, 16:31
  #7
Medlem
bornfree1985s avatar
Citat:
Ursprungligen postat av dbshw
En metod (men den är two-pass) är ju att först gå igenom hela array:n en gång och räkna antalet svarta, vita och röda kulor, och sen gå igenom array:n igen och swappa in allting på rätt plats direkt.

Jag tänkte annars på att modda den förra metoden du sa.
Typ att ha 3 räknare istället. Att man tänker att om svart ska vara till vänster, vit i mitten och röd till höger, så gör man precis som tidigare med de som ska till vänster o höger, och den som ska vara i mitten kan man plussa på även när den som ska vara till vänster plussas på. Alltså, viträknaren i detta fall plussas på både när svart och vit hittas, och sen är det som förut. Vad tror du om det?

Tack för att du tar dig tid för övrigt
Citera
2011-01-12, 18:11
  #8
Medlem
Citat:
Ursprungligen postat av bornfree1985
Jag tänkte annars på att modda den förra metoden du sa.
Typ att ha 3 räknare istället. Att man tänker att om svart ska vara till vänster, vit i mitten och röd till höger, så gör man precis som tidigare med de som ska till vänster o höger, och den som ska vara i mitten kan man plussa på även när den som ska vara till vänster plussas på. Alltså, viträknaren i detta fall plussas på både när svart och vit hittas, och sen är det som förut. Vad tror du om det?

Fast nja, jag tror att i så fall så kommer man inte kunna garantera att de vita och svarta ligger i ordning, va? För man vet ju så att säga inte var man ska "börja" lägga de vita.
Citera
2011-01-12, 18:53
  #9
Medlem
Det här borde fungera.
Kod:
s = 0
r = A.length - 1
i = 0

while i ≤ r
	while (A[i] är röd) & (i ≤ r)
		swap(A, i, r)
		r--
	if A[i] är svart
		swap(A, i, s)
		s++
	i++
Citera
2011-01-12, 18:57
  #10
Medlem
Citat:
Ursprungligen postat av rejkan
[...]

Den är ju dock O(n²) i värsta fall. (T.ex. om alla bollar är röda.)
Citera
2011-01-12, 19:01
  #11
Medlem
Citat:
Ursprungligen postat av dbshw
Den är ju dock O(n²) i värsta fall. (T.ex. om alla bollar är röda.)

Om alla bollar var röda skulle den gå igenom den inre loopen A.length gånger och sedan avsluta helt. Så jag ser inte hur det skulle bli O(n²).
Citera
2011-01-12, 19:03
  #12
Medlem
Celenos avatar
Citat:
Ursprungligen postat av dbshw
En metod (men den är two-pass) är ju att först gå igenom hela array:n en gång och räkna antalet svarta, vita och röda kulor, och sen gå igenom array:n igen och swappa in allting på rätt plats direkt.

Klart enklast och snyggast lösning och funkar med flera färger. Att den kör flera pass ändrar ju inte O(n).
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback