There are a few methods I can think of, and all of them involve partitioning - Binary Space Partitioning, Quadtrees (and by extension, Octrees) and k-d trees.
Binary Space Partitioning: Binary Space Partitioning, or BSP, works by dividing the list of polygons (or in your case entities) into 2, then subdivides those into 2 recursively, until it reaches a predetermined condition (e.g. 10 entities in a partition). The main benefit of BSP is that it allows you to determine groups of objects which must be drawn quickly. The disadvantage is that it can end up taking a lot more memory than the original list (because some objects are split in two - to make this work with entities, you would have to alter the algorithm slightly).
Quadtrees/Octrees: First of all, to make things clear - quadtrees and octrees work on exactly the same principle of each other, but quadtrees are used in 2-dimensional space, and octrees in 3-dimensional space. This is as a quadtree divides areas into 4 (top-left, top-right, bottom-left, bottom-right), whereas an octree divides areas into 8 (top-front-left, top-front-right, top-back-left, top-back-right, etc.). Octrees basically work by sorting the entities into the different areas, and then further subdividing the relevant/visible ones.
K-d trees: Finally, there are k-d trees. These are similar to BSP and Octrees in the sense that they divide up the area, but they operate on dimensions, and are always binary. I'll be honest, I'm not 100% clear on k-d trees - it would be best to do your own research.
At this point, I would advise reading about these (and googling the terms Denis suggested), and then making a decision. I'd go with octrees myself, but I don't know exactly what conditions you're under and what you're trying to do with these entities.