I think the only "flaw" if I dare to say so is when you check for collisions. Then you only look at asteroids that are less than 50 pixels away. There you could also calculate the interesting asteroids by using the radius of the checked asteroid (YTop = y - radius, YBottom = y + radius) and use those values to find possible collision asteroids.
True, but it does that, as it doesn't pass the collision object in, just the shape index. As there not all asteroids
Generally, you'd have a 2D partition rather than columns as seen here. Given that situation i'd probably still use a trivial reject max radius, before falling to the second level of tests.
However, one thing that is missing from the demo is a way to stop duplicated tests occurring. Since objects allocated as they move and prior to moving. it's more than likely you'll end up checking the same object more than once.
The remarkable trivial solution is use a unique stamp. If an object is within range to check, and it's stamp is invalid (<> to current stamp) you check. Once checked, you stamp it with the current stamp. This way even if it's in the partition 10 times, it only ever gets checked once..