I would like to take a moment to help everyone appreciate what N^2 complexity means, when there are 256 asteroids, this means that there are 65536 potential collisions that must be checked against, now this isn't too bad, lets make a gross understatement and say that the collision detection of these objects will take one nanosecond to determine, this means that for this grossly simplified model of the problem the absolute maximum framerate that we could possibly get assuming we did nothing other than collision detection (i.e. no drawing) using some insanely efficient bounding spheres implementation would be about 15258 FPS. pretty good right, we only want 60 FPS so what is the big deal, ok, well lets double it and see what happens.
now we have 512 asteroids that yields 262144 pairs, that's 3814 FPS, wow, that's still crazy good... but if you are perceptive, you might have noticed something, we increased our objects by a factor of 2, our framerate and amazingly high as it is, is now 1/4th what is was before, but that's no matter we have tones of room to expand, we only need 60 FPS and we have almost 4000. lets double it again.
1024 asteroids, 1048576 pairs => 953 FPS. wow, it was almost 4000 last time, now it's not even 1000. but no matter we still have a lot of room, lets go one more
2048 asteroids, 4194304 pairs => 238 FPS. lets do it again
4096 asteroids, 16777216 pairs => 60 FPS. oh, wow, all we did was multiply the number of asteroids by 8, and our framerate went from over 15000 FPS, to just 60, if we go just one more step we hit 15 FPS, the one after that and its down to 4 FPS. keep in mind, this is doing nothing more than an impossibly fast collision test, in reality 1ns is about the speed it takes to perform one multiplication instruction, even just a simple sphere collide test is substantially more complex then this, these numbers give you an understanding of the performance characteristics of the overhead of the comparison, just simply touching them, it's how fast the nested loop would run if it did nothing. and this assumes we do nothing else, no graphics, no input, no game logic. now their might be a better way of running these tests, but it doesn't really matter because right now this isn't even the bottleneck. the bottleneck comes once we have exhausted all possible cheap routs and have to actually collide with a BSP poly-object.
now you might say to yourself, why are we using this horrendously complex structure? the answer is because it gives us logN complexity collision tests, this is effectively the opposite of what we have at the top level, testing for collisions on a model with 100 polies? that will take about 7 steps, more or less (actually it'll provably be more like 25 in the real world) want to collide with a poly object with a BILLION polygons? oh, that'll take about 30 steps (honestly it'd probably be more like 300, but who's counting?) without the BSP tree an object ten million times more complex would need a ten million times as much time to collide with, rather than 4 times more.
so you see we are already using an extremely efficient algorithm to do the model tests, and yet it is still slower than the extremely slow high level test we are using, and it doesn't even get used for asteroids.